재귀

성현식·2022년 11월 2일
0

algorithm

목록 보기
3/7

recursion

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

for문을 활용하여 단순하게 *= 할 수 있지만, 재귀적으로 가능하다.


import sys		# 백준 1914번 - 하노이 탑

n = int(sys.stdin.readline())

# height층의 탑을 a 에서 b 로 옮기기
trace_plate = []
mul = 1
ans = 0 # 정답

# 가장 아래판을 남기고 빈 곳으로 이동 > 아래판 이동 > 다시 하노이.
def hanoi(height, a, b):
    if height>1: hanoi(height-1, a, 6-a-b)
    trace_plate.append(str(a)+' '+str(b))
    if height>1: hanoi(height-1,6-a-b,b)

if n <=20:
    hanoi(n, 1, 3)
    print(len(trace_plate))
    for x in trace_plate:
        print(x)
else:
    for x in range(1, n+1):
        ans += mul
        mul *= 2
    print(ans)

재귀적으로 반복되는 큰 틀을 정한 뒤, 마지막에 빠져나올 도착지를 확보한다.


import sys		# 백준 9663번 - Nqueen

n = int(sys.stdin.readline())

b = 0 # 정답

d = [False] * n 		# 각 행에 퀸이 놓였는지
e = [False] * (n*2 - 1) # 우상향 대각선에 몇번째 대각선에 퀸이 놓였는지
f = [False] * (n*2 - 1) # 우하향 대각선에 몇번째 대각선에 퀸이 놓였는지

def queen(x):
    for y in range(n):
        if (not d[y]) and (not e[x+y]) and (not f[n-1+x-y]):
            if x == n-1:
                global b
                b += 1
            else:
                d[y] = True
                e[x+y] = True
                f[n-1+x-y] = True
                queen(x+1)
                d[y] = False
                e[x+y] = False
                f[n-1+x-y] = False

queen(0)
print(b)

열당 하나를 놓는 반복에서, 행과 두 대각선에 놓인 여부를 확인하며 재귀로 채워나간다.


import sys		# 백준 1074번 - Z

n, r, q = map(int, sys.stdin.readline().split())

a = 2 ** n
b = q + 1
c = r + 1
d = -1 # 저장용

def get(x, y, z):               # 몇 행, 몇 열, 변의 길이
    global d
    if z != 2:
        if x <= z/2 and y <= z/2:   # 왼위
            get(x, y, z/2)
        if x > z/2 and y <= z/2:    # 오위
            d += ((z/2) ** 2)
            get(x-z/2, y, z/2)
        if x <= z/2 and y > z/2:    # 왼아
            d += ((z/2) ** 2)*2
            get(x, y-z/2, z/2)
        if x > z/2 and y > z/2:     # 오아
            d += ((z/2) ** 2)*3
            get(x-z/2,y-z/2,z/2)
    
    else:
        if x == 1 and y == 1: d += 1
        if x == 2 and y == 1: d += 2
        if x == 1 and y == 2: d += 3
        if x == 2 and y == 2: d += 4

get(b, c, a)
print(int(d))

숫자의 방향이 정해졌을 때, 큰 4조각의 순서를 행하고 변의길이를 반으로 줄여 그 속의 4조각을 다시 확인한다.

0개의 댓글