728x90
문제는 더보기!
더보기
문제
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.
- 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
- 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.
이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.
아래 그림은 원판이 5개인 경우의 예시이다.
어떻게보면 많은 사람들이 알 하노이 탑 문제이다!
재귀함수로 어떻게 풀까.. 고민을 하다가 문제를 쪼개푸는것에 집중해서 생각해보니 풀렸다.
내가 만약 3개의 원반을 옮기기 위해서는, 위의 2개의 원반을 한덩어리로 생각을 해 보았다. 즉, 내가 옮겨야 하는 원반이 몇개이던 위의 개수가 1개라고 생각해보자
그렇다면 1번에서 3번라인으로 옮기는건 쉬운문제가 된다. 1번칸을 2번으로 그리고 옮길 마지막 원반을 3번으로 그후에 2번에 있는 원판을 3번으로 옮기면 된다.
자 그렇다면 1번에서 2번으로 원반을 옮기는 문제로 변하게 된다. 근데 이 문제는 또 1번에서 2번으로 옮기는 원판의 마지막을 빼고보면 위에서 설명한것과 같은 원리로 동작하게 된다. 완벽히 재귀적으로 풀기 좋은 문제이다.
그래서 나는 함수의 인자로 시작점,옮길점,현재가장무거운 원반 을 넣고 구현해 보았다.
lst=[]
def f(start,end,N):
if N==1:
lst.append([start,end])
else:
f(start,6-start-end,N-1)
lst.append([start,end])
f(6-start-end,end,N-1)
f(1,3,int(input()))
print(len(lst))
for i in lst:
print(i[0],i[1])
내 위의 원판들을 임시로 놔둘 공간이 필요했는데, 생각해보니까 1,2,3의 합이 6이길래 거기서 시작점과 끝점을 빼면 무조건 빈칸의 판이 나온다는게 생각나서 구현해보았다!
728x90
'Python > 백준' 카테고리의 다른 글
2798_블랙잭 (0) | 2021.11.25 |
---|---|
2447_별찍기 -10 (0) | 2021.11.23 |
10250_ACM호텔 (0) | 2021.11.20 |
2775_부녀회장이 될테야 (0) | 2021.11.20 |
10870_피보나치 수열 (0) | 2021.11.20 |