글에 개요
백준 알고리즘 9095번 "1, 2, 3 더하기" 문제입니다.
이 문제는 DP(동적 계획법)을 활용하는 문제로 팰린드롬에 이어 2번째 등장이네요.
아마 동적 계획법에 사용되는 점화식의 활용에 익숙해지고, 이후 재귀함수로 구현할 때 Top-down, Bottom-up 방식해 질 때까지 최대한 꾸준히 풀어볼 생각입니다.
[백준 9095] 1, 2, 3 더하기: https://www.acmicpc.net/problem/9095
참고할 글
- [백준 10942] 팰린드롬? : http://brenden.tistory.com/27
핵심 내용
- 정수 n을 1,2,3의 조합으로 나타내는 방법의 수를 구하는 문제입니다.
- D[i] = i를 1,2,3의 조합으로 나타내는 방법의 수
- D[i] = D[i-1] + D[i-2] + D[i-3]
- 위 점화식을 활용하여 문제를 해결할 것입니다.
해결 방법
- n이 11보다 작은수라고 정해져 있기 때문에 크기가 11인 배열을 만들어줍니다.
- answerAry[0] = 1로 초기화
- 위의 점화식으로 해결할 때, 현재 index값이 3이 넘어가기 전까지는 1의 조합 혹은 2의 조합만 가능하기 때문에 이에 대한 예외처리를 해줍니다.
해결한 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Scanner; | |
public class Main { | |
public static boolean[][] answerAry; | |
public static void main(String[] args) { | |
Scanner sc = new Scanner(System.in); | |
int t = sc.nextInt(); | |
int[] answerAry = new int[11]; | |
answerAry[0] = 1; | |
for(int i = 1; i <= 10; i++) { | |
for(int j = 1; j <= 3; j++) { | |
if(i-j >= 0) | |
answerAry[i] += answerAry[i-j]; | |
} | |
} | |
while(t-- > 0) { | |
int n = sc.nextInt(); | |
System.out.println(answerAry[n]); | |
} | |
} | |
} |
백준 내용 참고
1, 2, 3 더하기 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 15097 | 9927 | 6909 | 64.162% |
문제
정수 4를 1, 2, 3의 조합으로 나타내는 방법은 총 7가지가 있다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1,2,3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1,2,3의 합으로 나타내는 방법의 수를 출력한다.
예제 입력 1
3 4 7 10
예제 출력 1
7 44 274
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[백준 11729] 하노이 탑 이동 순서 (0) | 2018.04.21 |
---|---|
[백준 11052] 붕어빵 판매하기 (0) | 2018.04.20 |
[백준 1509] 팰린드롬 분할 (0) | 2018.04.19 |
[백준 10942] 팰린드롬? (1) | 2018.04.19 |
[백준 10825] 국영수 (0) | 2018.04.18 |