[백준] 12100번 - 2048(Easy)
특별한 알고리즘이 필요한 문제는 아니다. 문제를 잘 읽고 그대로 구현하는 문제이다.
브루트포스로 가능한 모든 경우의 수를 탐색했으며, 게임판의 상태를 기준으로 이를 상, 하, 좌, 우로 움직이는 네 가지 경우의 수가 존재한다.
게임판을 움직이는 방식은 아래와 같이 구현했다.
- 블록을 이동시키는 방향을 기준으로 순서대로 탐색한다.
예를 들어, 블록을 위로 이동시킨다면, y=0(게임판 최상단)에서부터 n-1(게임판 최하단)까지 탐색하면서 y=k번째 칸에서 숫자 블록을 찾았다고 가정하자.- 이 때, y=k+1번째 칸부터 y=n-1칸까지 탐색하며 k블록 이후 첫 번째로 만나는 블록을 찾는다. k<q<n 인 q번째 칸에서 블록을 찾았다고 가정하자.
- 만약 q블록이 k블록과 숫자가 동일하다면, k블록을 2배로 만들고 q블록의 수를 0으로 만든다. 그리고 q+1칸 부터 탐색을 이어간다.
- 만약 q블록이 k블록과 숫자가 다르다면, 아무 연산도 하지 않고 q번째 칸부터 탐색을 이어간다. q번째 칸부터 탐색을 시작하는 이유는, q번째 칸이 m번째 칸(q<m<n)의 블록과 숫자가 일치할 수 있기 때문이다.
- 만약 k블록 이후 숫자 블록을 찾지 못했다면, 현재 열의 탐색은 종료되고 다음 열을 동일한 방식으로 탐색한다.
이 방식으로 같은 열 혹은 행에 동일한 숫자 블록 3개 이상이 존재해도 정상적으로 처리할 수 있다.
- 이 때, y=k+1번째 칸부터 y=n-1칸까지 탐색하며 k블록 이후 첫 번째로 만나는 블록을 찾는다. k<q<n 인 q번째 칸에서 블록을 찾았다고 가정하자.
- 1번 작업 이후 남아있는 숫자 블록을 이동시키려는 방향으로 전부 이동시킨다.
- 1,2번 작업을 5회 반복한 게임판에서 가장 큰 수를 구하고, 정답 변수와 비교하여 갱신한다.
구현 코드를 보면 알겠지만 상, 하, 좌, 우 움직임 모두 매커니즘은 동일하나 각각 조절해야하는 y,x인덱스 순서가 약간씩 달라 네 가지 경우 모두를 하드 코딩했다.
코드 이해를 돕기 위해 왼쪽으로 이동하는 코드에만 주석을 달았다.
1 |
|