ALGORITHM/BOJ

[DP 연습] BOJ_15988 1, 2, 3 더하기 3 (S2)

lemon-scone 2021. 9. 23. 16:09

https://www.acmicpc.net/problem/15988

 

15988번: 1, 2, 3 더하기 3

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.

www.acmicpc.net

 

1이랑 별반 다른 문제가 아닌 것 같아서 이상하다는 생각이 들었어도 그대로 짰는데, 계속계속 틀렸다고 떠서 빡쳤다. 대체 뭐가 문제지 싶어서 구글링을 해봐도 단지 배열을 선언해준 크기와 타입이나 위치만 다른 것 같은데 크게 문제될 게 없을 것 같은데 왜 자꾸 틀렸다고 하지 싶었다. 그런데 https://c-king.tistory.com/280 이분 글을 읽어보니까, 10억으로 나눈 나머지를 출력한다는 부분이 문제의 함정같은 것이고,  이 말인 즉슨10억이 넘는 곳이 있다는 뜻이기 때문에 배열의 범위를 int로 해주면 안되고 long으로 선언해줘야 한다는 것이였다. 그리고 mod를 나눠줘야 하는 건 어제 대충 이해를 했는데, 숫자의 범위가 너무 커지기 때문에 나머지정리 느낌으로 숫자의 크기를 줄여주는 개념인 것 같다. 그렇게 하지 않으면 overflow 가 발생해서 이상한 값이 저장되기 때문에!

 

아무튼 그래도 아직도 이해되지 않는 의아한 부분은,

testcase 반복문을 전체로 감싸면 아래처럼 시간초과가 나는 부분이였다. 왜인지 모르겠다..

 

넘어야 할 산이 참 많은데 시간은 촉박한 느낌이다!

 

 

 

1,2,3 더하기 1
1,2,3 더하기 3

 

package algo0923;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 1,2,3 더하기 3
public class BOJ_15988 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		for (int t = 1; t <= T; t++) {
			
			int N = Integer.parseInt(br.readLine());
			
			int[] dp = new int[N+1];
			
			dp[0] = 0;
			dp[1] = 1;
			dp[2] = 2;
			dp[3] = 4;
			
			for (int i = 4; i <= N; i++) {
				dp[i] = (dp[i-1] + dp[i-2] + dp[i-3])%1000000009;
			}
			sb.append(dp[N]).append("\n");
		}
		System.out.println(sb.toString());
	}
}
package algo0923;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 1,2,3 더하기 3
// https://c-king.tistory.com/280
public class BOJ_15988_sol {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		int mod = 1000000009;
		int size = 1000000;
		
		long[] dp = new long[size+1];
		
		dp[0] = 0;
		dp[1] = 1;
		dp[2] = 2;
		dp[3] = 4;
		
		for (int i = 4; i <= size; i++) {
			dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % mod;
		}
		
		for (int t = 0; t < T; t++) {
			int N = Integer.parseInt(br.readLine());
			sb.append(dp[N]).append("\n");
		}
		System.out.println(sb.toString());
	}
}
// 의아한 부분에 대한 코드
// testcase 반복문으로 전체를 감싼 시간초과가 발생한 코드

package algo0923;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 1,2,3 더하기 3
// https://c-king.tistory.com/280
public class BOJ_15988_sol2 {
	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int T = Integer.parseInt(br.readLine());
		int mod = 1000000009;
		int size = 1000000;

		for (int t = 0; t < T; t++) {
			int N = Integer.parseInt(br.readLine());

			long[] dp = new long[size + 1];

			dp[0] = 0;
			dp[1] = 1;
			dp[2] = 2;
			dp[3] = 4;

			for (int i = 4; i <= size; i++) {
				dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % mod;
			}
			sb.append(dp[N]).append("\n");
		}
		System.out.println(sb.toString());
	}
}