문제 설명
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할 수 있다.
이렇게 적혀져 있으면 뭔소린지 잘 이해가 안갈것이다... 아무래도 코드가 많이 더러우니 주석으로 설명을 해 넣겠다.
코드
'알고리즘 공부' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 - java (0) | 2021.10.21 |
---|---|
[백준 11559번] Puyo Puyo - java (0) | 2021.10.17 |
[백준 1100번] 하얀 칸 - java (0) | 2021.10.05 |
[백준 1764번] 듣보잡 - java (0) | 2021.10.04 |
[백준 12015번] 가장 긴 증가하는 부분 수열2 - java (0) | 2021.09.26 |