algorithm

๋ฐฑ์ค€ 12100 (์‚ผ์„ฑ ๊ธฐ์ถœ)

rkawk 2025. 3. 28. 22:49

https://www.acmicpc.net/problem/12100

์†Œ์š”์‹œ๊ฐ„ (2:01:00)

ํ’€์ด

4๊ฐœ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด์„œ ์ด๋™ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค.

๋ธ”๋ก์ด ๋ฐ€๋ฆฌ๋ฉด์„œ ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ๋งŒ ์ž˜ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

void shift_left(vector<vector<int> >& ori) {
    vector<vector<int> > v(N);
    // ์ „๋ถ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
    for (int i=0; i<ori.size(); i++) {
        for (int j=0; j<ori[i].size(); j++) {
            if (ori[i][j]) {
                v[i].push_back(ori[i][j]);
                ori[i][j] = 0;
            }
        }
    }
    // ํ•ฉ์น˜๊ธฐ
    for (int i=0; i<v.size(); i++) {
        if (v[i].size() < 1) continue;
        int idx = 0;
        for (int j=0; j<v[i].size(); j++) {
            ans = max(ans, v[i][j]);
            if (j == v[i].size()-1) {
                ori[i][idx] = v[i][j];
                continue;
            }
            if (v[i][j] == v[i][j+1]) {
                ori[i][idx] = v[i][j] * 2;
                ans = max(ans, ori[i][idx]);
                idx += 1;
                j += 1;
            }
            else {
                ori[i][idx] = v[i][j];
                idx += 1;
            }
        }
    }
}

๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ•ฉ์น˜๋Š” ๋กœ์ง์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ผํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๋ฐฉํ–ฅ์—๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ์นธ๋ถ€ํ„ฐ ํ–‰๋ ฌํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€ ๋‹ค์Œ ์ขŒํ‘œ์— ๋”ฐ๋ผ ํ•ฉ์ณ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋„ค๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™, ํ•ฉ์น˜๋Š” ๋กœ์ง๋งŒ ์ž˜ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

 

//
// Created by ljh on 25. 3. 28.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, ans;

vector<vector<int> >board(21, vector<int>(21));

void shift_left(vector<vector<int> >& ori) {
    vector<vector<int> > v(N);
    // ์ „๋ถ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
    for (int i=0; i<ori.size(); i++) {
        for (int j=0; j<ori[i].size(); j++) {
            if (ori[i][j]) {
                v[i].push_back(ori[i][j]);
                ori[i][j] = 0;
            }
        }
    }
    // ํ•ฉ์น˜๊ธฐ
    for (int i=0; i<v.size(); i++) {
        if (v[i].size() < 1) continue;
        int idx = 0;
        for (int j=0; j<v[i].size(); j++) {
            ans = max(ans, v[i][j]);
            if (j == v[i].size()-1) {
                ori[i][idx] = v[i][j];
                continue;
            }
            if (v[i][j] == v[i][j+1]) {
                ori[i][idx] = v[i][j] * 2;
                ans = max(ans, ori[i][idx]);
                idx += 1;
                j += 1;
            }
            else {
                ori[i][idx] = v[i][j];
                idx += 1;
            }
        }
    }
}
void shift_right(vector<vector<int> >& ori) {
    vector<vector<int> > v(N);
    // ์˜ค๋ฅธ์ชฝ ์›์†Œ ๋ถ€ํ„ฐ v์— ์ €์žฅ
    for (int i=0; i<ori.size(); i++) {
        for (int j=ori[i].size()-1; j>=0; j--) {
            if (ori[i][j]) {
                v[i].push_back(ori[i][j]);
                ori[i][j] = 0;
            }
        }
    }

    for (int i=0; i<v.size(); i++) {
        if (v[i].size() < 1) continue;
        int idx = 0;
        for (int j=0; j<v[i].size(); j++) {
            ans = max(ans, v[i][j]);
            if (j == v[i].size()-1) {
                ori[i][ori.size()-1 - idx] = v[i][j];
                continue;
            }
            if (v[i][j] == v[i][j+1]) {
                ori[i][ori.size()-1 - idx] = v[i][j] * 2;
                ans = max(ans, ori[i][ori.size()-1 - idx]);
                idx += 1;
                j += 1;
            }
            else {
                ori[i][ori.size()-1 - idx] = v[i][j];
                idx += 1;
            }
        }
    }
}
void shift_up(vector<vector<int> >& ori) {
    vector<vector<int> > v(N);
    // ์œ„์ชฝ ์›์†Œ ๋ถ€ํ„ฐ v์— ์ €์žฅ
    for (int j=0; j<ori.size(); j++) {
        for (int i=0; i<ori.size(); i++) {
            if (ori[i][j]) {
                v[j].push_back(ori[i][j]);
                ori[i][j] = 0;
            }
        }
    }

    for (int i=0; i<v.size(); i++) {
        int idx = 0;
        for (int j=0; j<v[i].size(); j++) {
            ans = max(ans, v[i][j]);
            if (j == v[i].size()-1) {
                ori[idx][i] = v[i][j];
                continue;
            }
            if (v[i][j] == v[i][j+1]) {
                ori[idx][i] = v[i][j]*2;
                ans = max(ans, ori[idx][i]);
                idx += 1;
                j += 1;
            }else {
                ori[idx][i] = v[i][j];
                idx += 1;
            }
        }
    }
}
void shift_down(vector<vector<int> >& ori) {
    vector<vector<int> > v(N);
    // ์œ„์ชฝ ์›์†Œ ๋ถ€ํ„ฐ v์— ์ €์žฅ
    for (int j=0; j<ori.size(); j++) {
        for (int i=ori.size()-1; i>=0; i--) {
            if (ori[i][j]) {
                v[j].push_back(ori[i][j]);
                ori[i][j] = 0;
            }
        }
    }

    for (int i=0; i<v.size(); i++) {
        int idx = 0;
        for (int j=0; j<v[i].size(); j++) {
            ans = max(ans, v[i][j]);
            if (j == v[i].size()-1) {
                ori[ori.size()- 1-idx][i] = v[i][j];
                continue;
            }
            if (v[i][j] == v[i][j+1]) {
                ori[ori.size()- 1 -idx][i] = v[i][j]*2;
                ans = max(ans, ori[ori.size()- 1 -idx][i]);
                idx += 1;
                j += 1;
            }else {
                ori[ori.size()- 1 -idx][i] = v[i][j];
                idx += 1;
            }
        }
    }
}


void func(vector<int>& idx, vector<vector<int> >& v) {
    if (idx.size() == 5) {
        auto ori = v;
        for (auto e : idx) {
            if (e == 0) shift_left(ori);
            if (e == 1) shift_right(ori);
            if (e == 2) shift_up(ori);
            if (e == 3) shift_down(ori);
        }
        return;
    }

    for (int i=0; i<4; i++) {
        idx.push_back(i);
        func(idx, v);
        idx.pop_back();
    }
}
int main(){
    // initiate
    cin>>N;
    board.resize(N, vector<int>(N, 0));
    for (int i=0; i<N; i++)
        for (int j=0; j<N; j++)
            cin>>board[i][j];

    vector<int>idx;

    func(idx, board);
    cout<<ans;

}