하다보니

12100번-2048(Easy) 본문

알고리즘 풀이/백준

12100번-2048(Easy)

claire 2022. 3. 30. 18:01
/*
2048 문제
- 게임판을 상하좌우로 기울인다. 5번 기울여서 최대값을 고른다. -> 모든 경우의 수를 다 확인. 
- 게임판을 기울이면 숫자가 기울면서 합쳐진다. -> 상하좌우는 게임판을 돌려서 구현하고, 기울여서 합쳐지는 함수 
*/

#include<iostream>
#include<algorithm>
using namespace std;

int n;	//한변의 길이
int board1[25][25];	//입력받는 원본 게임판
int board2[25][25]; //복사하여 최대값을 구하려는 것


void rotate() {
	int tmp[25][25];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			tmp[i][j] = board2[i][j];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			board2[i][j] = tmp[n - 1 - j][i];
}

void tilt(int dir) {
	while (dir--)rotate();
	for (int i = 0; i < n; i++) {
		int tilted[25] = {};
		int idx = 0;
		for (int j = 0; j < n; j++) {
			if (board2[i][j] == 0)continue;
			if (tilted[idx] == 0) {
				tilted[idx] = board2[i][j];
			}
			else if (tilted[idx] == board2[i][j]) {
				tilted[idx++] *= 2;
			}
			else {
				tilted[++idx] = board2[i][j];
			}
		}
		for (int j = 0; j < n; j++)board2[i][j] = tilted[j];
	}

}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board1[i][j];
		}
	}
	//5번 돌릴때마다 4가지 경우의 수
	int mx = 0;
	for (int tmp = 0; tmp < 1024; tmp++) {
		//매 경우마다 새로운 board2를 복사해서 사용
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				board2[i][j] = board1[i][j];
		int brute = tmp;
		//5번의 각각 해당하는 값. 4진법 사용하여 0000~3333까지 
		for (int i = 0; i < 5; i++) {
			int dir = brute % 4;
			brute /= 4;
			tilt(dir);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				mx = max(mx, board2[i][j]);
	}
	cout << mx;
}

 

'알고리즘 풀이 > 백준' 카테고리의 다른 글

14888번-연산자 끼워넣기  (0) 2022.04.05
14502번-연구소  (0) 2022.03.30
20055번-컨베이어 벨트 위의 로봇  (0) 2022.03.27
2206번-벽 부수고 이동하기  (0) 2022.03.17
2579번-계단 오르기  (0) 2022.03.12