알고리즘 공부

[백준 12100번] 2048(easy) - java

철매존 2021. 10. 16. 21:22
728x90

문제 설명

1. N개의 크기가 정해진 보드가 주어진다.

2. 보드에 2~ 1024의 크기 내의 숫자들이 주어진다.

3. 숫자들은 위로, 아래로, 왼쪽으로, 오른쪽으로 딱 붙여서 정리할 수 있으며, 위로 이동하는 경우 이전의 숫자와 이후의 숫자가 같으면 두 숫자는 합쳐진다( 8에 8이 이동하면 16하나가 되는 느낌이다.)

4. 5번의 이동이 있은 후 가능한 최대 숫자를 return하면 된다.

풀이 과정

 1. 엄청나게 코드를 더럽게 풀었다. 모든 경우를 하나하나 만들었음...

 2. 재귀함수 문제이다. 적절한 범위를 지정해 주면 된다.

 3. 간단하게 코드에 대해 설명하자면

- 위, 아래, 오른, 왼 코드를 하나씩 만들어서 모든 경우를 탐색한다 (위 - 위 - 위 - 위 - 위), (위, 위, 위, 위, 아래) ......

- 그리고 각각의 경우에서는 기존 보드를 가져와서 한쪽 면에 빈 칸 없이 딱 붙이는 방법을 정의한다 -> 맨위로 다 붙이려면 stack을 써서 0인 경우는 넣지 않고 이외의 경우 집어넣은 후 그 stack을 위에서부터 넣으면 될 것이다.

- 그럼 그 stack에서 같은 숫자들을 합치는 경우는, stack의 맨 위 값과 이후 0이외의 숫자의 값이 같으면, 그걸 2배 해주면 된다. 

--- 참고로 4 4 4 8 처럼 4와4를 더해 8이 되고, 8과8을 더해 16이 되는 경우라고 하면 4와4만 해주고 이후 8은 더하면 안될 것이다. 그 경우는 한번 합치면 이를 boolean으로 표시해주고 진행해주면 될 것이다.

- 그렇게 해서 stack에 값이 들어가면, 이후 다시 처음부터 위의 프로세스들을 진행시킬 새로운 맵을 만들어 줄 것이다. 이는 stack에 있는 것들을 뒤에서부터 넣으면 가능할 것이다.

- 그리고 이렇게 stack의 값들을 뺴줄 때 마다 최대값을 구해준다.

- 그걸 총 5번 반복한 뒤 나가면 최대의 숫자를 return할 수 있다.

 

이렇게 적혀져 있으면 뭔소린지 잘 이해가 안갈것이다... 아무래도 코드가 많이 더러우니 주석으로 설명을 해 넣겠다.

코드