공부를 다시 시작하자!👸🏻
문제 설명
음이 아닌 정수 N을 한 개 이상의 음이 아닌 정수의 합으로 나타낼 때, 이를 "N을 분해한다"라고 부르자.
예를 들어, 4 = 1+1+1+1 = 1+1+2 = 1+3 = 2+2 = 4로 나눌 수 있다.
분해 곱이란 N을 분해해서 나타난 수들을 전부 곱한 것을 의미한다. N=4일 때, 분해 곱은 다음과 같다.
- 4 = 1+1+1+1, 곱 : 1*1*1*1 = 1
- 4 = 1+1+2, 곱 : 1*1*2 = 2
- 4 = 1+3, 곱 : 1*3 = 3
- 4 = 2+2, 곱 : 2*2 = 4
- 4 = 4, 곱 : 4*1=4
입력
첫째 줄에 음이 아닌 정수 N이 주어지고 N은 1,000,000보다 작거나 같다.
출력
숫자가 너무 클 것을 대비하여 10007로 나눈 나머지를 출력한다.
풀이 방법
0= 0 ,곱 0*1=0
1= 1 ,곱 :1*1=1
2= 2 ,곱 :2*1=2
3= 3 ,곱 :3*1=3
4= 4 ,곱 :4*1=4
5= 2+3 ,곱 :2*3=6
6= 3+3 ,곱 :3*3=9
7= 3+2+2 ,곱 :3*2*2=12
8= 3+3+2 ,곱 :3*3*2=18
9= 3+3+3 ,곱 :3*3*3=27
0~9까지 연산을 하나하나 적용하니 5부터는 분해할 때 3이 들어가야 한다는 규칙이 보였다.
그래서 6부터는 arr[index]=arr[index-3]*3 이라는 점화식을 이용하여 문제를 해결하였다.
왜?
규칙이 있고 점화식으로 푸는 게 가능하기 때문에 DP가 최선이라고 생각했고 N의 숫자가 생각보다 크기 때문에 한 번의 연산만으로 푸는 것이 좋기 때문에 해당 방법을 사용하였다.
코드
n=int(input())# 입력
dp=[0]*1000001 # N이 입력받을 수 있는 숫자+1 만큼 선언
dp[1]=1 #예외적인 부분들은 미리 선언
dp[2]=2
dp[3]=3
dp[4]=4
for i in range(5,n+1):
dp[i]=(dp[i-3]*3)%10007 #점화식 적용
print(dp[n])
'코딩테스트 대비' 카테고리의 다른 글
[프로그래머스] 줄 서는 방법 (0) | 2021.07.18 |
---|---|
[프로그래머스] 단어 변환 (0) | 2021.07.17 |
[알고리즘] 탐색(순차 탐색,이진 탐색) (0) | 2021.05.16 |
[프로그래머스] 쿼드압축 후 개수 세기 (0) | 2021.04.10 |
[프로그래머스] 오픈채팅방 (0) | 2021.04.04 |