[Python]알고리즘/백준

[다이나믹 프로그래밍] 9095번 - 1, 2, 3 더하기

HSY_mumu 2022. 4. 21. 16:34
728x90
t = int(input())  # 테스트 케이스 수
for _ in range(t):
  n = int(input())  # 정수
  d = [0] * 11  # 11보다 작은 양수
  d[1], d[2], d[3] = 1, 2, 4 
  for i in range(4, n + 1):
    d[i] = d[i - 3] + d[i - 2] + d[i - 1]

  print(d[n])

[백준] 9095번 - 1, 2, 3 더하기

(한줄평) 아이디어만 떠올린다면 쉽게 풀 수 있는 문제!

풀이 시간: 20분 이내

1) 문제 해결 아이디어

11보다 작은 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 문제다.

DP문제는 보통 아이디어만 잘 떠올리고 점화식을 세운다면 코드 자체는 간결하게 해결할 수 있는 문제가 많은데 이 문제가 그렇다.

 

<n을 1, 2, 3의 합으로 나타내기 위한 3가지 경우의 수>

1. 마지막에 더해진 값이 1인 경우, 1 앞에 더해진 값들의 합은 (n - 1)이다.

2. 마지막에 더해진 값이 2인 경우, 2 앞에 더해진 값들의 합은 (n - 2)이다.

3. 마지막에 더해진 값이 3인 경우, 3 앞에 더해진 값들의 합은 (n - 3)이다.

 

<점화식>

여기서 1, 2, 3의 경우의 수는 아래와 같이 직접 구해서 1, 2, 4로 초기화하였다.

더보기

1 = 1

2 = 1 + 1

  = 2

3 = 1 + 1 + 1

  = 1 + 2

  = 2 + 1

  = 3

 

2) 소스코드

t = int(input())  # 테스트 케이스 수
for _ in range(t):
  n = int(input())  # 정수
  d = [0] * 11  # 11보다 작은 양수
  d[1], d[2], d[3] = 1, 2, 4 
  for i in range(4, n + 1):
    # 마지막에 더해진 값이 1, 2, 3인 경우
    d[i] = d[i - 1] + d[i - 2] + d[i - 3]

  print(d[n])
728x90