[20251017] BOJ / P3 / 자물쇠 / 이종환 #1148
Merged
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.
🧷 문제 링크
https://www.acmicpc.net/problem/1514
🧭 풀이 시간
180분
👀 체감 난이도
✏️ 문제 설명
세준이는 노트북을 누가 가져갈까봐 자물쇠로 잠가놓는다. 자물쇠는 동그란 디스크 N개로 구성되어 있다. 각 디스크에는 숫자가 0부터 9까지 숫자가 표시되어 있다. 디스크는 원형이기 때문에, 0과 9는 인접해 있다.
세준이는 한 번 자물쇠를 돌릴 때, 최대 세 칸을 시계 방향 또는 반시계 방향으로 돌릴 수 있다. 또, 최대 세 개의 인접한 디스크를 한 번에 돌릴 수 있다.
현재 자물쇠의 상태와 세준이의 비밀번호가 주어질 때, 자물쇠를 최소 몇 번 돌려야 풀 수 있는지 구하는 프로그램을 작성하시오.
자물쇠의 상태가 555이고, 세준이의 비밀번호가 464인 경우에, 각 디스크를 따로 따로 돌리면 3번 돌려야 한다. 하지만, 디스크 3개를 동시에 돌려서 444로 만들고, 2번째 디스크를 6으로 돌리면 2번만에 돌릴 수 있다.
🔍 풀이 방법
처음에는 단순히 그리디하게 접근했지만, 바로 틀렸다.
dp로 해야할것 같긴 했는데, 계속해서 구현을 실패해서, 결국 해설을 찾아서 풀었다.
dp[i][a][b][c]를 통해서 i번째에 a, i+1번째에 b, i+2번째에 c가 오게 하려면 필요한 최소 회전횟수를 구하면 되는것이다.
이를 구하는 메서드를 만들어서 재귀적으로 구하게하면 된다. 이때 메모이제이션을 통해 한번 구한값은 바로 반환하게 해야한다.
⏳ 회고
최근에 도전한 문제 중에 제일 어려웠다. 풀이 봤는데도 이해못해서 구현하는데 한참 걸렸다.... 아이디어 진짜 복잡하네