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;
}