일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- 백트래킹
- 스택
- LIS
- 알고리즘
- oracle
- 다이나믹프로그래밍
- BFS
- dfs
- HashMap
- Stack
- 시뮬레이션
- DP
- 탐색
- 브루트포스
- 문자열
- Queue
- SQL
- 구현
- Java
- 빅데이터
- BufferedReader
- 다리 만들기
- 프로그래머스
- 새벽코딩
- 완전탐색
- 백준
- Python
- 배열
- 아스키코드
Archives
- Today
- Total
새벽코딩
[백준] [9095] 1, 2, 3 더하기 (JAVA) (dp) 본문
반응형
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 (추가 시간 없음) | 512 MB | 109410 | 72121 | 49597 | 64.324% |
문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 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의 합으로 나타내는 방법의 수를 출력한다.
※ JAVA 코드 (1, 2, 3 더하기)
import java.io.*;
import java.util.*;
public class Main {
public static boolean chk;
public static int T;
public static int[] dp;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
dp = new int[11];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
dp[4] = 7;
for(int i = 5; i <= 10; i++) {
dp[i] = dp[i-3] + dp[i-2] + dp[i-1];
}
while(T-- > 0) {
int n = Integer.parseInt(br.readLine());
System.out.println(dp[n]);
}
}
}
※ 생각정리 (1, 2, 3 더하기)
1. dp문제에서 가장 중요한 패턴찾기
1을 만드는 경우 : 1
2를 만드는 경우 : 1 + 1, 2
3을 만드는 경우 : 1 + 1 + 1, 2 + 1, 1 + 2, 3
여기까지를 보고 패턴이 보이느냐가 중요하다.
3을 만드는 경우는 1을 만드는 경우에 2를 더하는 것 + 2를 만드는 경우에 1을 더하는 것과 같다.
즉 dp[3] = dp[1] + dp[2] + dp[0] (0)
dp[4] = dp[1] + dp[2] + dp[3] 의 패턴을 찾을 수 있다.
점화식으로 만들면 dp[n] = dp[n-3] + dp[n-2] + dp[n -1]
- 새벽코딩 -
반응형
Comments