[백준] 2011 암호코드

문제보기

진짜 도랐나보다

mod 안나눠주고 20분동안 대체 왜안되지 하고 반례 뒤지고 있었음 ^^….

import java.util.*;
import java.io.*;

// DP - Bottom Up
public class Main{
  static final int mod = 1000000;

  public static void main(String []args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String s = br.readLine();
    // 입력이 0 인 경우 처리
    if( s == null ){
      System.out.println(0);
      return;
    }
    int len = s.length();
    int[] a = new int[len+1]; // 주어진 배열을 담을 변수
    long[] d = new long[len+1]; // 'i번째부터 끝까지' 일 때 가능한 경우의 수
    for(int i = 0 ; i < len ; i++){
      a[i] = s.charAt(i) - '0';
    }
	
    d[len] = 1; // 이건 사실 숫자가 없는 자린데 1로 줘야된다
    d[len-1] = a[len-1] == 0 ? 0 : 1; // 맨 끝자리애가 0이면 여기는 0으로 초기화

    // 뒤에서부터 수행해주자
    for(int i = len-2 ; i >= 0 ; i-- ){
      int c = a[i];
      // 0 인 경우 더이상 추가될 수 있는게 없다. 앞자리가 1이나 2이길 바랄뿐. 패스~
      if(c == 0){
        continue;
      }else if(c == 1){ // 1인 경우 뒷자리 숫자가 뭐든간에 두가지 경우가 가능함
        d[i] = (d[i+1] + d[i+2])%mod;
        continue;
      }else if(c == 2){ // 2인 경우 뒷자리 숫자가 6이하이면 두가지 경우가 가능함
        if(a[i+1] <= 6){
          d[i] = (d[i+1] + d[i+2])%mod;
          continue;
        }    
      }
      // 여기까지 오는 애들은 1,2가 아니던지 2인데 뒷자리 숫자가 7이상인거다
      d[i] = d[i+1]%mod;
    }
    System.out.println(d[0]);
  }
}

Comments