(실버) 11729 하노이탑

‍한승운·2021년 2월 25일
0

https://www.acmicpc.net/problem/11729

나의 풀이

import sys

inp = int(sys.stdin.readline().rstrip())

print(2**inp -1)

def func(n, start, end, extra) :
  if n ==1 :
    print(start, end)
  else :
    func(n-1, start, extra, end)
    func(1, start, end, extra)
    func(n-1, extra, end, start)

func(inp, 1, 3, 2)
나보다 빠르고 간결해 보이는 풀이
def m(n,a,b,c):
    y=a+' '+c
    if n==1:
        return y
    x=m(n-1,a,c,b)
    z=m(n-1,b,a,c)
    return '\n'.join([x,y,z])

s=m(int(input()),'1','2','3')
print(s.count('\n')+1)
print(s)
  • 푸는 방식
    1. 가장 큰 n 번째 원판을 제외한 n-1개의 원판을 기둥 A,B가 아닌 다른 중간 기둥으로 옮긴다
    2. n번째 원판을 기둥 A에서 기둥 B로 옮긴다.
    3. n-1개의 원판을 중간기둥에서 기둥 B로 옮긴다.
  • 최소 수행 횟수
n개를옮기는데필요한최소의시행횟수:h(n)h(1)=1h(n)=2h(n1)+1(n>=2)여기서양변에1을더해서유도h(n)+1=2(h(n1)+1)h(n)=2n1n개를 옮기는데 필요한 최소의 시행 횟수 : h(n) \\ h(1) = 1 \\ h(n) = 2h(n-1) + 1 (n>=2) \\ 여기서 양변에 1을 더해서 유도 \\ h(n) + 1 = 2(h(n-1) + 1) \\ h(n) = 2^n -1
profile
함께 성장하고 싶은 백엔드 개발자

0개의 댓글

관련 채용 정보