반응형
사이트 링크 : https://codeup.kr/problem.php?id=2698
문제는 아래와 같습니다.
문제
하노이 탑 게임에 대한 규칙은 잘 알고 있을 것이다.
위 그림은 3개의 원판을 가지는 하노이 탑을 나타낸다. 이 게임의 목적은 A탑에 있는 1~3번까지의 원반을 C탑으로 모두 옮기는 것이다.
단, 다음 규칙을 지키면서 옮겨야 한다. 그리고 하노이2에서는 새로운 규칙 4)가 추가되었다.
1) 한 번에 하나의 원판만 옮길 수 있다.
2) 반드시 큰 원판 위에 작은 원판이 올라가야 한다.
3) 각 탑의 맨 위에 있는 원판만 옮길 수 있다.
4) 반드시 인접한 기둥으로만 원판을 옮길 수 있다.
만약 원판이 1개 라면,
- 1번 원판을 A에서 B로 옮긴다.
- 1번 원판을 B에서 C로 옮긴다.
따라서 총 2번을 옮기면 모두 옮길 수 있다.
여러분은 n개의 원판이 주어질 때 이 원판을 옮기는 횟수 및 과정을 출력하는 프로그램을 작성하시오.
입력
- 첫 줄에 한 정수 n이 입력된다. (단, 1 <= n <= 12 )
출력
- 첫 번째 줄부터 한 줄에 하나씩 이동 경로를 "n : X->Y"행태로 출력한다.
마지막 줄에 총 옮긴 횟수를 출력한다.경로의 의미는 n번원판을 X기둥에서 Y기둥으로 옮긴다는 의미이다.
문제 해결 포인트
- 하노이탑이라고 해서 재귀를 사용해야할줄 알았는데 문제 요구사항을 자세히 보면 DP 테이블을 만들푸는 문제입니다.
- 하노이탑을 하나씩 분석해보면 a[i] 가 전에 있던 a[i-1] 의 값을 앞으로 가는 방향 뒤로가는 방향이 중복이 됩니다.
- 문제를 푸는 점화식은 a[i] = a[i-1] + a[i]:A->B+ reverse(a[i-1]) + a[i]:B-> C + a[i-1] 입니다.
정답코드
복붙 가능코드
n = int(input())
dp = [[],[]]
dp[1] = [(1,'A','B'),(1,'B','C')]
def moveHanoi(n,X,Y):
return str(n)+' : '+X+'->'+Y
for i in range(2,n+1):
dp[i%2].clear()
for j in dp[(i-1)%2]:
dp[i%2].append(((j[0],j[1],j[2])))
dp[i%2].append(((i,'A','B')))
for j in reversed(dp[(i-1)%2]):
dp[i%2].append((j[0],j[2],j[1]))
dp[i%2].append(((i,'B','C')))
for j in dp[(i-1)%2]:
dp[i%2].append(j)
for i in dp[n%2]:
print(moveHanoi(i[0],i[1],i[2]))
print(len(dp[n%2]))
dfs(a)
print(dp[a])
해당 문제는 계속 리뷰를 해서 코드를 정교화 해보는것도 좋은것 같습니다.
반응형
'알고리즘 > 코드업' 카테고리의 다른 글
369 게임 3 (Large Test Case) - 파이썬 (DP) (0) | 2022.05.24 |
---|---|
0/1 배낭 문제(Knapsack Problem) - 파이썬(DP) (0) | 2022.05.20 |
리모컨 - 파이썬(DP) (0) | 2022.05.15 |