일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- ENFJ
- Python
- 백준
- 스택
- 3
- DP
- 더하기 시리즈
- 컴공
- 수 정렬하기2
- 파이썬
- Greedy
- 백준풀이
- 구현
- 11066
- 브루트포스
- 코딩
- knuth_optimization
- 오늘의 계획
- 오픽
- BFS
- 다이나믹 프로그래밍
- 정규 표현식 #문자열
- 정렬
- 2
- HTML
- 12969
- DFS
- 1
- 백트래킹
- 웹 페이지 입문
- Today
- Total
코딩하는 Fug
15989 1,2,3 더하기 4 본문
https://www.acmicpc.net/problem/15989
#dp
15989번: 1, 2, 3 더하기 4
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다. 1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2
www.acmicpc.net
#15989 1,2,3 더하기 4
#1
import sys
input=sys.stdin.readline
#스탠다드 인풋
t=int(input())
#테스트 케이스 t 입력
num=[]
for n in range(t):
num.append(int(input()))
#num 입력
dp=[[],[1,0,0],[1,1,0],[1,1,1]]
#인덱스 i 의 인덱스는 순서대로 1만 사용한 경우 2만 사용한 경우 3만 사용한 경우 이다.
for i in range(4,max(num)+1):
next=[]
next.append(dp[i-1][0])
next.append(dp[i-2][1]+dp[i-2][0])
next.append(dp[i-3][2]+dp[i-3][1]+dp[i-3][0])
#인덱스 i 는 i-1 에서 1만 사용한 수 ~ 이런식이다.
dp.append(next)
#답
#코드를 찾던 중 다른 코드가 있어서 생각하게 됐다.
#2
import sys
input = sys.stdin.readline
t = int(input())
l = []
for _ in range(t):
l.append(int(input()))
dp=[1 for i in range(max(l)+1)]
for i in range(2, max(l)+1):
dp[i] += dp[i - 2]
for i in range(3, max(l)+1):
dp[i] += dp[i - 3]
for i in l:
print(dp[i])
# 이것 역시 잘 생각을 해보니 i-2 i-3 가 들어있는 for문의 순서가 중요했다. 이유인 즉슨 i-2 for문 부터 시작해야 1만 사용하는 수부터 저장이 되어 결국에는 이전에 내가 사용했던 코드의 알고리즘처럼 작동이 되었다.
#점화식을 시작할때 생각해야할 점은 내가 이미 사용하고 있는 방법, 즉 인간의 뇌로 이미 당연하게 사용하고 있는 것을 컴퓨팅적 사고로 풀어낸다라고 명심하는 것이다. 이 문제같은 경우에도 경우의 수를 생각할때 이미 나는 답을 알고 있었다. 2를 제외하고 생각하면 i-2를 2이하의 수로 고르는 것이다. 같은 생각을 하면서 풀었는데 결국에는 그것을 컴퓨터로 표출하지 못해서 굉장히 시간이 많이 걸렸던 문제, 점화식에 관한 문제를 좀더 풀어봐야겠다.
'백준풀이-python' 카테고리의 다른 글
12101 1,2,3 더하기 2 (0) | 2021.10.13 |
---|---|
9095 1,2,3 더하기 (0) | 2021.10.13 |
1890 점프 (0) | 2021.10.12 |
15486 퇴사 2 (0) | 2021.10.12 |
16930 달리기 (0) | 2021.10.08 |