나아가는 길에 발자국을 찍어보자

[백준/BOJ] 12100번 2048(Easy) 본문

Algorithm/Problem Solving

[백준/BOJ] 12100번 2048(Easy)

NAWIN 2020. 1. 11. 02:07
반응형

이번주에는 구현문제를 열심히 풀었는데 그중 제일 나를 괴롭혔던 문제였다.

처음에 문제 이해가 잘 안되서 게임을 해봤는데 이지 문제라서 그런지 게임과는 달리

새로운 블록을 추가하지 않아 이해하고 나면 간단한 문제이다.

현재 상태에서 4방향으로 이동할수있고,  블록을 이동시켜서 최대 5번 이동해서(5번 이하로 이동해도 가능)

만들수있는 가장 큰 블록의 값을 구하면 된다.

 

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

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.

www.acmicpc.net

 

문제는 완전 탐색으로 풀었다. 현재 상태에서 위,아래,오른쪽,왼쪽으로 이동할때 재귀를 돌렸다. 

까다롭다고 생각했던건 블록의 이동을 구현하는것이었는데, 내가 생각했던건 이동을 한방향으로 가는걸로 만들고

이동시키는 배열을 돌려서 4방향으로 이동시키는 것과 같은 걸로 해 구현을 했다. 

이동하는 부분을 함수로 따로 구현하고 싶었는데 2차원 배열을 반환하는 걸 찾아봐도 잘 모르겠어서 그냥 노가다를 했다.ㅜㅜ

이부분은 다음에 공부를 해봐할듯하다. 역시 포인터는 헷갈려...

 

 

 

 

 

 

<코드>

#include<iostream>
#include<vector>
#include<queue>
#include<functional>
#include<algorithm>
#include<string.h>
using namespace std;

int N;
int M = 0;

void te(int adj[50][50], int n) {
	if (n > 5)return;
	bool ck = true;
	int rep[50][50] = { 0 };
	int idx = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {

			if (M < adj[i][j])M = adj[i][j];
		}
	}

	//왼
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (adj[i][j]) {
				if (idx>0 && rep[i][idx - 1] == adj[i][j]&&ck) {
					rep[i][idx - 1] += adj[i][j];
					ck = false;
				}
				else {
					rep[i][idx] = adj[i][j];
					idx++;
					ck = true;
				}
			}
		}
		idx = 0;
	}
	te(rep, n + 1);
	//아래
	idx = 0;
	ck = true;
	memset(rep, 0, sizeof(rep));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (adj[N - 1 - j][i]) {
				if (idx>0 && rep[i][idx - 1] == adj[N - 1 - j][i]&&ck) {
					rep[i][idx - 1] += adj[N - 1 - j][i];
					ck = false;
				}
				else {
					rep[i][idx] = adj[N - 1 - j][i];
					idx++;
					ck = true;
				}
			}
		}
		idx = 0;
	}
	te(rep, n + 1);

	//오
	idx = 0;
	ck = true;
	memset(rep, 0, sizeof(rep));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (adj[i][N - 1 - j]) {
				if (idx>0 && rep[i][idx - 1] == adj[i][N - 1 - j]&&ck) {
					rep[i][idx - 1] += adj[i][N - 1 - j];
					ck = false;
				}
				else {
					rep[i][idx] = adj[i][N - 1 - j];
					idx++;
					ck = true;
				}
			}
		}
		idx = 0;
	}
	te(rep, n + 1);

	//위
	idx = 0;
	ck = true;
	memset(rep, 0, sizeof(rep));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (adj[j][N - 1 - i]) {
				if (idx>0 && rep[i][idx - 1] == adj[j][N - 1 - i]&&ck) {
					rep[i][idx - 1] += adj[j][N - 1 - i];
					ck = false;
				}
				else {
					rep[i][idx] = adj[j][N - 1 - i];
					idx++;
					ck = true;
				}
			}
		}
		idx = 0;
	}
	te(rep, n + 1);

	return;
}





int main(void) {

	scanf("%d", &N);
	int adj[50][50];

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> adj[i][j];
		}
	}

	te(adj, 0);
	printf("%d", M);
	return 0;
}

 

 

 

 

 

 

반응형
Comments