Problem : 2048 (easy)
유형 : DFS
문제, 예제 입출력 설명
해결 전략
완전탐색이지만, 어떻게 탐색을 해야 할지 고민해보아야한다.
나의 경우deque
자료구조를 이용했다.
움직이는 방향에 맞춰서
deque
에 순차적으로 push 한다.
이때 원소는{숫자, 합쳐짐 여부}
로 설정하였다.
0
으로 표현되는 빈칸의 경우에는 의미가 없으니deque
에 넣지 않았다.
만약맨 마지막에 들어간 숫자
가,현재 숫자
와 같고 합쳐진적이 없다면
맨 마지막의 숫자
를 빼고, 두 배를 한뒤 합쳐진적이 있다고 표시하고 다시 넣었다.
주의할 점
deque
를 사용할 경우,front
와back
을 헷갈리지 말자
풀이
DFS
- 5번 움직였다면, 최대 숫자를 찾고 dfs를 종료한다.
- 5번 움직이지 않았다면
- 현재 상태을 따로 백업해둔다.
- 방향에 맞춰서 돌려준다.
- dfs 깊이를 증가시키고, 다음 dfs를 진행하러 간다.
방향에 맞춰 움직여준다.
- 방향에 맞춰
deque
에 차례대로, 원소를 넣는다. - 작업이 끝난뒤 남은 공간은
0
으로 채워준다.
(다른 풀이) 방향에 맞춰서 움직일때, 게임판 자체를 돌린다.
- 새로운풀이 코드
2020-03-08 추가
- 상, 하 , 좌 , 우 의 경우를 전부 따로 처리하지 않고,
- 게임판 자체를 돌린다음, 한쪽방향 으로만 움직이게 한다.
예시
좌측으로 밀어 넣는 경우만 구현해놓고- 게임판을 우측으로 90도 돌리고, 좌측으로 밀어버린다면
- 기존 게임판에서 아래로 밀어버리는 결과를 낳게된다.
Deque를 채운다.
{숫자, 합쳐짐 여부}
여부로 채운다.맨 마지막에 들어간 숫자
가,현재 숫자
와 같고 합쳐진적이 없다면맨 마지막의 숫자
를 빼고, 두 배를 한뒤 합쳐진적이 있다고 표시하고 다시 넣는다.
맨 마지막에 들어간 숫자
가,현재 숫자
와 다르거나 합쳐진적이 있다면현재 숫자
를 합쳐짐 표시를 하지않고 넣는다.
코드
1 |
|
코드2
1 |
|
피드백
만약 새로운 원소가 들어 올때
deque
의front
가 아닌back
을 확인해야함.
계속front
를 확인하고 있어서 애매하게 이상한 값이 나왔다.
눈버깅 하다가 30분 넘게 못 찾으면, 그냥 단계 별로 콘솔에 찍어보자.