더 많이 실패하기

백준 15990번 1, 2, 3 더하기 5 Java (☆공부 265일차) 본문

알고리즘/백준

백준 15990번 1, 2, 3 더하기 5 Java (☆공부 265일차)

김발자~ 2023. 4. 21. 22:26
반응형

15990 1,2,3 더하기 5

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

 

15990번: 1, 2, 3 더하기 5

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

www.acmicpc.net

 

 

 

 


백준 15990번 문제 1, 2, 3 더하기 5


문제


 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 (추가 시간 없음) 512 MB 23375 7928 5531 30.967%

문제

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 3가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 단, 같은 수를 두 번 이상 연속해서 사용하면 안 된다.

  • 1+2+1
  • 1+3
  • 3+1

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 100,000보다 작거나 같다.

출력

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

예제 입력 1

3
4
7
10

예제 출력 1

3
9
27

 

 

 


과정 생각해보기


 

https://gimbalja.tistory.com/246

 

공부 125일차: 백준 15990번 1, 2, 3 더하기 5 자바 java

15990 1,2,3 더하기 5 https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 백준 159

gimbalja.tistory.com

4달 전에 풀어본 문제

 

dp 문제다 보니 풀이 자체는 다른 점이 없지만,
1, 2 에서 한 번 나머지를 구하고 또 3까지 더한 다음에 나머지를 구하면 long 타입으로 선언하지 않아도 된다

 

 

 


정답 인정 코드


 

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
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        final int REMAINDER = 1_000_000_009;
        
        int t = Integer.parseInt(br.readLine());
        int[][] dp = new int[100_001][4];
        dp[1][1= 1;
        //dp[2][1] = 1;     1+1이므로 1이 더 붙을 수 없다(같은 숫자는 2개까지 가능)
        dp[2][2= 1;
        dp[3][1= 1;
        dp[3][2= 1;
        dp[3][3= 1;
        
        for(int i = 4; i < dp.length; i++) {
            dp[i][1= (dp[i-1][2+ dp[i-1][3]) % REMAINDER;
            dp[i][2= (dp[i-2][1+ dp[i-2][3]) % REMAINDER;
            dp[i][3= (dp[i-3][1+ dp[i-3][2]) % REMAINDER;
        }
        
        for(int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            sb.append((((dp[n][1+ dp[n][2]) % REMAINDER ) + dp[n][3]) % REMAINDER).append("\n");
        }
 
        System.out.println(sb);
    }
 
}
 
cs

 

 

 


StringBuilder와 int의 차이로 메모리와 시간 모두 절약

반응형
Comments