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.
🔗 문제 링크
2022 KAKAO BLIND RECRUITMENT 사라지는 발판
플레이어 A와 B가 게임을 진행하는데, 양 플레이어가 캐릭터를 몇 번 움직이게 될 지 예측하고자 한다.
발판이 있는 부분과 없는 부분으로 이루어진 최대 5 x 5 크기의 격자 보드에서 캐릭터를 움직인다. 최초의 캐릭터 위치는 반드시 발판 위에 있으며, 캐릭터는 상하좌우로 인접한 4칸 중 발판이 있는 곳으로만 이동한다. 밟고 있던 발판은 다른 곳으로 이동할 때 사라진다.
게임이 종료되는 조건은 아래와 같이 2가지이다.
항상 플레이어 A가 먼저 시작하며, 두 플레이어는 "최적의 플레이"를 수행한다. 최적의 플레이는 다음을 의미한다.
게임 보드의 초기 상태를 나타내는 2차원 정수 배열
board
와 플레이어 A의 캐릭터 초기 위치를 나타내는 정수 배열aloc
, 플레이어 B의 캐릭터 초기 위치를 나타내는 정수 배열bloc
이 매개변수로 주어진다. 양 플레이어가 최적의 플레이를 했을 때, 두 캐릭터가 움직인 횟수의 합을 return 하도록 solution 함수를 완성하라.✔️ 소요된 시간
2시간 박고 GG
✨ 수도 코드
보드 크기가 작기 때문에, 모든 경우를 다 확인하면서 최선의 경우일 때의 움직임 횟수를 반환해주면 된다. 그렇기 때문에 DFS를 사용하며, base case는 문제에서 설명한 것처럼 "더 이상 움직일 수 없는 경우"이다.
다만 각 플레이어는 이기거나 지기 위해 행동하지 않는다. 그저 "최선을 다할 뿐"이다. 다시 말해, 매 턴마다 "이기고 있다면 최대한 빨리 끝내도록, 지고 있다면 최대한 오래 버티도록" 움직임을 선택한다. 그렇기 때문에 현재 내가 "이기고 있는 지, 지고 있는 지" 확인하는 것이 중요하다.
플레이어 A를 "나", 플레이어 B를 "상대"라고 가정하자.
플레이어 A가 항상 먼저 시작한다고 했기 때문에, 끝났을 때의 턴이 짝수라면 내가 진 것이고 홀수라면 내가 이긴 것이다.
이런 식으로 승패를 구할 수 있으므로, 각 턴마다 취해야 할 행동을 승패 결과에 따라 다르게 정해줘야 한다.
이러한 조건을 가지고 코드를 작성한다.
📚 새롭게 알게된 내용
수도 코드 자체는 심플하게 잡히는 것 같은데 이상한 데서 자꾸 터져서 블로그 찾아보니 게임 이론의 최소 극대화 알고리즘란 것이었다. 이 알고리즘을 제대로 알고 있어야 이해가 가는데, 나도 아직 이해를 다 하지 못해 더 확인해봐야 할 것 같다.
나름 여태까진 재귀 정도는 괜찮게 다룰 수 있다고 생각했는데 머리 띵...
도움 받은 블로그: BaaaaaaaarkingDog