티스토리 뷰

알고리즘/백준

1,2,3 더하기3 15988번 백준

글을 쓰는 개발자 2020. 12. 3. 21:00
반응형

문제:www.acmicpc.net/problem/15988

 

15988번: 1, 2, 3 더하기 3

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

www.acmicpc.net

이 문제는 1,2,3더하기 5 에서 경험했던 것을 토대로 풀었다. 맞긴 맞았는데 시간에 대한 개선이 필요한 것 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
N=int(sys.stdin.readline().rstrip())
loc=0
mod=1000000009
li=[]
for _ in range(N):
    li.append(int(sys.stdin.readline().rstrip()))
    loc=max(loc,li[-1])
dp = [[0]*(3+1for _ in range(loc+1)]
dp[1]=[0,1,0,0]
dp[2]=[0,1,1,0]
dp[3]=[0,2,1,1]
for i in range(4,loc+1):
    dp[i][1]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][3])%mod
    dp[i][2]=(dp[i-2][1]+dp[i-2][2]+dp[i-2][3])%mod
    dp[i][3]=(dp[i-3][1]+dp[i-3][2]+dp[i-3][3])%mod
for i in li:
    print((dp[i][1]+dp[i][2]+dp[i][3])%mod)
cs

 

풀이법은 예를 들어 5라는 숫자는 1+ (4를 구성하는 갯수), 2+(3을 구성하는 갯수),3+(2를 구성하는 갯수) 이런 원리로 풀었다. 근데 가만히 생각해보니깐 이렇게 나눌 필요 없이 그냥 dp[i]=dp[i-1]+dp[i-2]+dp[i-3]으로 풀어도 될 것 같다는 생각이 들어서 했는데 맞았다. 물론 dp[0]=1이라는 예외가 있긴 하지만 말이다.

 

1
2
3
4
5
6
7
8
9
10
dp = [0]*1000001
dp[0]=1;dp[1]=1;dp[2]=2
for i in range(3,1000001):
    if dp[i]==0:
        dp[i] = dp[i-1]+dp[i-2]+dp[i-3]
        dp[i] %= 1000000009
for _ in range(int(input())):
    n = int(input())
    print(dp[n])
 
cs

 

그러면 위와 같은 코드가 나온다.

반응형

'알고리즘 > 백준' 카테고리의 다른 글

RGB거리2 17404번 백준  (0) 2020.12.04
카잉 달력 6064번 백준  (0) 2020.12.04
가장 긴 증가하는 부분 수열 4 14002번 백준  (0) 2020.12.02
합분해 2225번 백준  (0) 2020.12.02
제곱수의 합 1699번 백준  (0) 2020.12.02
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함