Algorithm/SW Expert Academy

[Python] 4869. 종이 붙이기

느낌표 공장장 2021. 9. 14. 17:47

재귀 방식으로만 푼 코드 

 

# 규칙 (입력 받은 숫자 n)
# n-20 * 2 + n - 10
# 맨 처음, 즉 n = 10일때부터 구해나가서, 입력받은 숫자 n까지 도달할때까지 구한다.
def paper_use(n):
    if n == 10:
        return 1
    elif n == 20:
        return 3
    else:
        return 2 * paper_use(n-20) + paper_use(n-10)


t = int(input())

for t in range(1, t+1):
    n = int(input())
    print('#{} {}'.format(t, paper_use(n)))

 

DP 코드 (점화식 이용)

 

# 점화식을 이용하기 위해 n의 크기마다 경우의 수를 저장할 리스트 만들기
# 규칙이 (현재의 수-2) * 2 + (현재의 수-1) 이므로 숫자 2개 필요
# n = 10일 경우 -> 1개 , n = 20일경우 -> 3개 이므로 미리 넣어준다.
# 0은 크기(n)과 인덱스를 같게 하기 위해 하나 추가해줌
memo = [0, 1, 3] + [0 for _ in range(28)]

def paper_use(n):
    global memo     # 경우의 수가 저장되어있는 memo 사용하기 위함

    # n에 값이 비어있다면 규칙을 이용해 넣어준다
    # 그런데 n-2, n-1에도 값이 비어있다 ? 그럼 재귀를 이용해 들어가서 계속 구한다.
    # (n = 3 부터 쭉 채우게 된다)
    if not memo[n]:
        memo[n] = 2 * paper_use(n-2) + paper_use(n-1)

    # memo[n]에 경우의 수가 저장되어있다면 바로 반환
    return memo[n]


t = int(input())

for t in range(1, t+1):
    n = int(input())//10    # 경우의 수와 인덱스로 편하게 이용하기 위해 //10 해줌
    print('#{} {}'.format(t, paper_use(n)))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 4873. 반복 문자 지우기  (0) 2021.09.14
[Python] 4871. 그래프 경로  (0) 2021.09.14
[Python] 4866. 괄호 검사  (0) 2021.09.14
[Python] 1219. 길찾기  (0) 2021.09.14
[Python] 2005. 파스칼의 삼각형  (0) 2021.09.14