백준 - 5

서희찬·2021년 7월 24일
0

백준

목록 보기
5/105

10872 : 팩토리얼

def fact(n):
    if n==1:
        return 1
    return n*fact(n-1)

num = int(input())
if num==0:
    print(1)
else :
    print(fact(num))

팩토리얼 함수를 재귀형태로 구현했다.
그리고 num==0일 경우도 처리해줬다.

10870 : 피보나치 수

def fibo(n):
    if n<=1:
        return n
    return fibo(n-2)+fibo(n-1)

num = int(input())
print(fibo(num))

n이 1 이하일때 탈출조건만 고려해주면 된다 !

재귀는 탈출조건이 중요하다 !

11729 : 하노이 탑 이동 순서

def HanoiTowerMove(num,_from,by,to):
    #이동해야 할 원반의 수가 1개일 경우 재귀 탈출 
    if(num==1):
        print(f"{_from} {to}")
    else :
        HanoiTowerMove(num-1,_from,to,by) #n-1개 옮기기 
        print(f"{_from} {to}")
        HanoiTowerMove(num-1,by,_from,to)

num=int(input())
print(2**num-1) # 하노이탑 최소이동횟수 : 2^num - 1 
HanoiTowerMove(num,1,2,3)

하노이 탑 최소이동횟수 공식인 Tn = 2^n -1를 알면 첫번째 출력결과는 쉽게 구할 수 있고
n개의 블럭이 1에 있다고 생각하면 제일 큰것을 제외한 n-1개의 블럭을 2로 옮기고 3에는 제일 큰 블럭을 옮기면 된다.
그러고 나머지를 3으로 옮기면된다.
이것을 재귀적으로 생각한게 위의 코드 이다.

2447 : 별 찍기 - 10

def MakeStarList(n):
    arr=[]
    #num == 9일때 len(n) == 3 
    for i in range(3*len(n)):
        if i//len(n)==1: #몫이 1일때 
            arr.append(n[i%len(n)]+" "*len(n)+n[i%len(n)])
        else : # 몫이 다른 값일 경우 stars로 채움 
            arr.append(n[i%len(n)]*3) 
    return (list(arr))

stars=["***","* *","***"]  #디폴트 패턴 

num = int(input())
count = 0
while num != 3:
    num = int(num/3)
    count+=1 #제곱수 - 1 구하기 

for _ in range(count):
    stars = MakeStarList(stars)

for i in stars:
    print(i) 

후하..
뒤지는줄..!

규칙찾기 진짜 힘들었다
그런데 num이 3,9 그려본 결과
2차원 배열을 생각했을때 인덱스값과 3나눴을때 몫이 1인케이스가 비어있는 케이스 이므로 이 것을 반복한다고 생각하면서 리스트를 만들어준다고 생각하면된다.
그게 위에 코드이다....!

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글