[Baekjoon-19236] jihoon #161
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
19236은 구현 & 백트래킹 문제입니다.
고려할 사항이 넘 복잡해서 풀다가 답지 좀 참고하고 다시 풀었습니다,,ㅠ
먼저 크게 진행 순서는 아래와 같습니다.
2.1 물고기 이동: 1번부터 16번 순차 진행
2.2 상어 이동: 먹은 물고기 방향에 있는 물고기들을 먹는 경우의 수를 큐로 담고 각 큐에 대해서 다음 분기 진행
2.3 상어가 이동할 수 있을 때 까지 반복하며 이동하지 못하면 먹을 수 있는 물고기 번호의 합 갱신
1번은 직접 값을 넣어주고
2번부터는 전부 dfs로 진행됩니다.
이때, 힘들었던 부분이 백트래킹을 진행하면 물고기의 정보, 상어 정보, 보드의 정보가 모두 돌아와야 했다는 것입니다.
따라서 모든 변수들의 값은 전역이 아닌 지역변수로 관리하고 함수의 매개변수로 넘겨주며 재귀를 진행하여 백트래킹 했을 때, 값이 돌아올 수 있도록 했습니다.
2.1번의 물고기의 이동은 현재 물고기의 방향에 대해서 미리 설정해둔 8가지의 방향에 따라서 가장 먼저 이동이 가능할 때 움직이게 됩니다.
그리고 물고기들은 Fish 구조체로 구성되어 fish배열의 1번부터 16번까지 관리되어 순서대로 탐색하게 했습니다. 이와 반대로 보드는 좌표기반으로 등록해서 각각의 위치 변경이 쉽게 했습니다.
다시 돌아와서 45도씩 회전하며 움직일 수 있을 때, 타겟 위치와 구조체의 위치 값인 xy값만 교환해주고, 보드의 물고기 좌표 값도 변경합니다.
2.2번은 먼저 상어가 이동 가능한지 확인하는 함수로 들어가는데, 해당 함수에서 이동 가능한 위치를 큐에 담아서 반환하도록 합니다. 해당 큐가 비어 있다면 2.3번으로 이동합니다.
큐에 좌표가 담겨 있다면, 큐에서 각 위치를 꺼내며 해당 위치의 물고기를 상어가 먹은 뒤, 기존 위치는 빈칸으로 설정합니다. 여기서 상어가 기존에 있던 위치를 빈칸으로 설정하는게 매우 중요했습니다...
또한, 2.2번에서 진행되는 변경 사항들은 모두 새로운 copy 배열에서 변경하고 해당 배열을 다음 dfs로 넘겨주어 기존 값의 변경이 일어나지 않도록 합니다.
(추가로 각 함수마다 매개변수는 &로 참조를 걸어주어 값을 이어받도록 합니다.)
2.3번에서는 2.2번을 반복적으로 진행하며, 큐에 담긴 좌표가 없을 경우 진행됩니다. 전역 변수로 설정한 maxPoint의 값을 현재 상어가 누적해온 point와 비교해서 최댓값으로 갱신합니다.
이렇게 모든 경우의 수에 대해서 탐색이 종료되면 maxPoint를 출력하면 문제가 풀립니다.