[백준] 9095 1,2,3더하기
- 다이나믹으로 풀기
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.valueOf(bf.readLine());
// N은 최대 11이므로
int[] d = new int[12];
d[1] = 1;
d[2] = 2;
d[3] = 4;
// 1,2,3 의 합으로 나타내는 경우의 수 구하기
// 예를들어 d[4] = d[3]( 3+1 = 4) + d[2]( 2+2 = 4 ) + d[1]( 1+3 = 4)
for(int i = 4 ; i <= 11 ; i++ ){
d[i] = d[i-1] + d[i-2] + d[i-3];
}
StringBuilder sb = new StringBuilder();
while(n-- > 0){
sb.append(d[Integer.valueOf(bf.readLine())]);
sb.append("\n");
}
System.out.println(sb);
}
}
- 재귀로 풀기
import java.util.*;
public class Main {
public static int go(int sum, int goal){
//목표값보다 합이 넘어가는 경우는 필요읎다
if(sum > goal) return 0;
//목표값과 합이 같다면 cnt++되어야함
if(sum == goal) return 1;
int now = 0;
// 1, 2, 3을 넣는 경우를 각각 재귀호출
// 목표값과 일치한다면 1이 반환되므로 now에 차곡차곡 값이 쌓일것..
for(int i = 1; i <= 3; i++){
now += go(sum+i, goal);
}
return now;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t-- > 0){
int goal = sc.nextInt();
int cnt = go(0, goal);
System.out.println(cnt);
}
}
}
N이 작기 때문에 그냥 떠오르는대로 빠르게 푸는것이 중요
Comments