지우너

[BOJ] 2011 JAVA 본문

Problem Solving

[BOJ] 2011 JAVA

지옹 2024. 12. 8. 16:38

문제

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

 

풀이

문제 이해하기

  • 예제1) 25114

2까지만 보면 {B} = 1

25까지 보면 {BE('2', '5'), Y('25')} = 2

251까지 보면 {BEA('2', '5', '1'), YA('25', '1')} = 2

2511까지 보면 {BEAA('2', '5', '1'. '1'), BEK('2', '5', '11'), YAA('25', '1', '1'), YK('25', '11')} = 4

25114까지 보면 {BEAAD('2', '5', '1'. '1', '4'), YAAD('25', '1', '1', '4'), YAN('25', '1', '14'), YKD('25', '11', '4'), BEKD('2', '5', '11', '4'), BEAN('2', '5', '1', '14')} = 6

 

  • 예제2) 1111111111 (1_111_111_111)

편의상 3자리로 끊어서 언더바를 추가함.

1까지 보면 {A} =1

11까지 보면 {AA('1', '1'), K('11')} =2

111까지 보면 {AAA(1, 1, 1), KA(11, 1), AK(1, 11)} =3

1_111까지 보면 {AAAA(1, 1, 1, 1), AAK(1, 1, 11), AKA(1, 11, 1), KAA(11, 1, 1), KK(11, 11)} =5

11_111까지 보면 {AAAAA(1, 1, 1, 1, 1), AAAK(1, 1, 1, 11), AAKA(1, 1, 11, 1), AKAA(1, 11, 1, 1), KAAA(11, 1, 1, 1), AKK(1, 11, 11), KAK(11, 1, 11), KKA(11, 11, 1)} =8

 

규칙이 조금 보이는 것 같지 않은가??

이전 자리수+현재자리수가 10~26 사이라면 dp[i]= dp[i-1]+dp[i-2]

else dp[i]=dp[i-1] 처럼 보인다.

 

맞는지 확인해보자

111_111 = 5+8 = 13

1_111_111 = 8+13 = 21

11_111_111 = 21+13 = 34 

111_111_111 = 34+21 = 55

1_111_111_111 = 55+34 = 89

 

예제 정답이 나왔다. 

 

코드

import java.util.Scanner;

public class Main {
    public static final int MAX_N = 5000;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String code = sc.nextLine();
        code = " " + code;

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

        // 초기값
        dp[0]=1;

        // 전개
        for (int i = 1; i < code.length(); i++) {
            int num = code.charAt(i) - '0';

            if(num>0){
                dp[i]=dp[i-1];
            }

            //i==1이면 i-2할 수 없음
            if(i==1 || code.charAt(i-1)=='0') continue;

            // 이전 자리+현재 자리
            num= (code.charAt(i-1) - '0')*10 + (code.charAt(i) - '0');
            // 1000000으로 나눈 나머지를 저장
            if(num>=10 && num<=26){
                dp[i]= (dp[i]+dp[i-2]) % 1_000_000;
            }

        }

        // output
        System.out.println(dp[code.length()-1]);
    }
}

'Problem Solving' 카테고리의 다른 글

[BOJ] 11652 JAVA  (0) 2024.12.10
[BOJ] 11650 JAVA  (0) 2024.12.09
[BOJ] 2133 풀이 C++/Java  (0) 2024.12.06
[프로그래머스 Lv.0] 등수 매기기  (0) 2024.12.02
[BOJ] 3040. 백설공주와 일곱 난쟁이 C++  (0) 2024.11.28