알고리즘

[백준] 9095번: 1, 2, 3 더하기(python)

홍비 2022. 11. 8. 02:17

📌 문제 정의

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

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net


🗒 풀이

1) 재귀 + 점화식 이용

def LRR(num):
    # Linear Recurrence Relations
    if num == 1:
        return 1
    elif num == 2:
        return 2
    elif num == 3:
        return 4
    else:
        return LRR(num - 1) + LRR(num - 2) + LRR(num - 3)


T = int(input())
for _ in range(T):
    n = int(input())
    print(LRR(n))

점화식을 쳐봤더니 Linear Recurrence Relations이라는 번역이 나와서, LRR이라는 함수명으로 지정했다.

일단 이 문제를 풀려고 봤는데 잘 모르겠어서 연습장에 문제 예시를 막 끄적여봤다.

밑의 텍스트는 내가 연습장에 쓴 것들을 타이핑 한 것이다.

점화식 = 수열의 각 항들끼리의 성립하는 관계

피보나치가 a_n+2 = a_n+1 + a_n

1 1 2 3 5 8 13 21 34 …(a_0=0, a_1=1)

1 = (1) = 1
2 = (1,1) (2)  = 2
3 = 1,1,1 ; 1,2 ; 2,1; 3 = 4
4 = 1,1,1,1; 1,1,2; 1,2,1; 2,1,1; 3,1; 1,3; 2,2 = 7
5 = 1,1,1,1,1; 1,1,1,2, ; 1,1,2,1; 1,2,1,1; 2,1,1,1; 3,2; 2,3; 1,1,3; 1,3,1; 3,1,1; 1,2,2; 2,1,2; 2,2,1 = 13
6 = 1,1,1,1,1,1(1) ; 1,1,1,1,2 (5) 1,1,1,3 (4) 2,2,2(1); 3,3(1); 1,1,2,2; 1,2,1,2 ;1,2,2,1 ;2,1,2,1 ; 2,1,1,2; 2,2,1,1; (6)
1,2,3 132 213 231 312 321 (6) = 24 = 13 7 4 = 24

쓰다보니 일정한 규칙이 있는 것을 알았고, 3개씩 더하는 피보나치 수열이라는 것을 알았다. 이 구한 것들을 토대로 총 몇개의 경우의 수가 있는지 알아냈다.

 

 

2) 동적 계획법

이 방법은 스터디 같이 하던 친구가 했던 방법인데, 이렇게도 풀어보고 싶어서 한번 더 풀어봤다.

import sys

input = sys.stdin.readline

ans = [0] * 11  # 입력받은 정수는 11 미만이므로
ans[1] = 1
ans[2] = 2
ans[3] = 4

for i in range(4, 11):
    ans[i] = sum(ans[i-3:i])

T = int(input())
for _ in range(T):
    print(ans[int(input())])

일단 문제에서 입력받은 정수는 11 미만이므로  ans 배열 변수를 미리 만들어놓는다.

다음 1, 2, 3의 값은 1, 2, 4라는 것을 알고 있으니 미리 지정한다. 이는 재귀함수로 코드를 짤 때와 같다.(위의 텍스트 참고)

그리고 말했듯이 3개의 피보나치 배열이라는 것을 아니, 3개 단위로 묶어 i부터 이전 3개의 합산을 각 배열에 넣어준다.

그 다음 입력받은 값들의 해당 인덱스 값을 반환해주면 된다.


🤔 후기

이건 그래도 손으로 끄적이면서 확실한 규칙을 찾아 더 재밌게 풀 수 있었다.