매우 standard한 하노이탑을 이해하기란 나의 머리로 쉽지 않았다.
솔직히 상상이 안갔던 것 같다.
나는 개인적으로 DP를 머리보단 유형으로 푸는 타입이었기에 이제는 DP를 생각하면서 푸는 페러다임을 마련해야함을
느꼈다.
가장 DP와 재귀의 기초라는 하노이탑을 풀 수 없는 골 1이라니, 수치스럽기도 하고 발전해야겠다는 강한 동기부여가 들었다.
하노이탑은 간단히 1번의 봉에 있는 원판을 크기가 큰 것이 밑으로 가도록 배열해 3번으로 모두 옮기면 된다.

다음은 원판 3개의 예시이고, 초기 상태에 1번 봉의 최상단에 있는 원판이 숫자 1번 원판이다.
우리가 원판을 옮기려면 어떻게 해야할까?
문제를 분해해보자
원판 n-1개를 어느 한 지점에 몰아둔 뒤, 원판 하나만 옮기는 방식으로 코딩을 진행하면 되지 않을까?
n-1개를 한 지점에 둔 뒤, 그 경로를 통해 경유하는 방식으로 점화식을 세울 수 있다.

2번째 케이스(else)를 면밀히보자.
n-1개를 mid로 옮긴 뒤 자신이 옮긴 위치를 출력하고, 경유지에 있던 n-1을 최종적으로 start를 통해 mid로 목적지로 옮긴다.
print(start, to)가 중간에 끼어있는 이유는, n-1개의 탑을 옮긴 뒤 최 하단 층 원판을 to로 옮기는 것을 의미한다.
풀이는 굉장히 간단한데 아이디어를 찾는게 힘든 문제인 것 같다.
DP 골드는 답 안보고 풀게 못 된다...
DP 팁을 개인적으로 찾고 싶었는데
1. 일단 무지성으로 그리고, 상상하라
무지성으로 가장 간단한 케이스를 찾아 노가다해보자
2. 하노이탑 문제처럼, 경유할 수 있는지를 찾아보자
엔트로피와 엔탈피가 상태함수인 것 처럼, 경유지만 찾고 그 합산만 계산하면 컴퓨터가 띡 결과만 뽑아내어준다.
3. 인자를 잘 잡아라
최대한 간단한 함수인자를 잡자, 그래야 코드가 직관적으로 이해하기 편하다
4. 점화식을 만들자
함수도 수학식처럼 공통된 형태가 묶인 것으로, 더한다는 것의 의미는 그 함수를 함께 수행한다는 의미이다.
5. 주석을 달자
전기낭비하지 않으려면 주석을 달아 코드를 편하게 수정할 수 있도록 하자
6. 재귀를 DP로 풀 수 있는지 생각해보라
DP로 보다 좋은 방법을 찾았다면 DP를 써라
'PS문제풀이' 카테고리의 다른 글
백준 2162 선분그룹(python) (0) | 2023.07.29 |
---|---|
백준 1647:도시 분할 계획(python) 크루스칼 알고리즘 (0) | 2023.07.29 |
백준 27172-수 나누기 게임(python) (에라토스테네스 아이디어 응용) (0) | 2023.07.29 |
백준 2623 음악프로그램 위상정렬 알고리즘 (0) | 2023.07.27 |
[그리디 알고리즘]1700-멀티탭 스케줄링 (0) | 2023.07.16 |