Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 15991번 1, 2, 3 더하기 6 - Java

    2023. 1. 2.

    by. Hyeon-Uk

    반응형

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

     

    15991번: 1, 2, 3 더하기 6

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

    www.acmicpc.net


    풀이

    DP를 이용해서 문제를 해결했습니다.

    DP[N] = 조건에 맞춰서 N을 만드는 경우의 수 입니다.

     

    먼저 차근차근 규칙을 찾아가봅시다

    1 = 1

    2 = 1+1 / 2

    3 = 1+1+1 / 3

    4 = 1+1+1+1 / 2+2

    5 = 1+1+1+1+1 / 1+3+1

    6 = 1+1+1+1+1+1 / 1+2+2+1 / 1+1+2+1+1 / 2+2+2 / 3+3

     

    6을 기준으로 규칙을 살펴보면

    1+(조건에 맞게 4를 만드는 경우)+1 => 1+(1+1+1+1)+1 / 1+(1+2+1)+1

    2+(조건에 맞게 2를 만드는 경우)+2 => 2+(2)+2

    3+(조건에 맞게 0을 만드는 경우)+3 => 3+(0)+3

    로 정리를 할 수 있습니다.

     

    N을 기준으로 규칙을 살펴보면

    1+(조건에 맞게 N-2를 만드는 경우)+1 => DP[N-2]의 양옆에 1을 붙이는 경우

    2+(조건에 맞게 N-4를 만드는 경우)+2 => DP[N-4]의 양옆에 2를 붙이는 경우

    3+(조건에 맞게 N-6을 만드는 경우)+3 => DP[N-6]의 양옆에 3을 붙이는 경우

     

     

    이 규칙에 맞춰서 점화식을 세워보면

    DP[N] = DP[N-2] + DP[N-4] + DP[N-6] ; (단 각 인덱스가 음수가 나올 경우에는 0으로 대체)

     

    시간복잡도

    O(N)

     

    코드

    import java.io.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
    
            long[] dp = new long[100001];
            dp[0]=1;
            dp[1] = 1;//1
            dp[2] = 2;//1+1,2
            dp[3] = 2;//1+1+1,3
    
            for (int i = 4; i <= 100000; i++) {
                dp[i] = ((i - 2 >= 0 ? dp[i - 2] : 0) + (i - 4 >= 0 ? dp[i - 4] : 0) + (i - 6 >= 0 ? dp[i - 6] : 0)) % 1000000009;
            }
    
            int T = Integer.valueOf(br.readLine());
            while (T-- > 0) {
                int n = Integer.valueOf(br.readLine());
                sb.append(dp[n]).append("\n");
            }
    
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            bw.write(sb.toString());
            bw.flush();
        }
    }
    반응형
    저작자표시 (새창열림)

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 15681번 트리와 쿼리 - Java  (0) 2023.01.02
    [백준OJ] 19542번 전단지 돌리기 - Java  (0) 2023.01.02
    [백준OJ] 2160번 그림 비교 - Java  (0) 2023.01.02
    [백준OJ] 16973번 직사각형 탈출 - Java  (0) 2022.12.31
    [백준OJ] 16985번 Maaaaaaaaaze - Java  (0) 2022.12.31

    댓글

    관련글

    • [백준OJ] 15681번 트리와 쿼리 - Java 2023.01.02
    • [백준OJ] 19542번 전단지 돌리기 - Java 2023.01.02
    • [백준OJ] 2160번 그림 비교 - Java 2023.01.02
    • [백준OJ] 16973번 직사각형 탈출 - Java 2022.12.31
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바