삐까냥의 파도타기

1562. 계단 수 본문

코딩/백준 알고리즘

1562. 계단 수

금손형아 2019. 3. 19. 23:26

방문한 숫자를 체크하고 개수를 파악하며 나아가는 로직


로직이 도저히 생각안나, 타 사이트를 통해 로직 공부를 했습니다.


코드만 보고 이해하기 쉽도록 변수명에 신경썼습니다.

설명 없이 코드와 주석만 보고 이해해보세요.



import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.StringTokenizer;


public class Q1562 {


static int[][][] dp = new int[101][10][1024];

public static void main(String[] args) throws Exception {

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

StringTokenizer st = new StringTokenizer(br.readLine());

int modNum = 1000000000;

int allVisit = 1023; //모든 숫자를 방문했을 때의 값 (1111111111)

int inputNumLength = Integer.parseInt(st.nextToken());

for (int i = 1; i <= 9; i++) {

dp[1][i][1<<i] = 1;

}

//지금 숫자의 길이 (ex. 152의 숫자 길이 = 3)

for (int numLength = 2; numLength <= inputNumLength; numLength++) {

//지금 숫자의 마지막 숫자 (ex. 152의 마지막 숫자 = 2)

for (int lastNum = 0; lastNum <= 9; lastNum++) {

for (int preVisitCheck = 0; preVisitCheck <= allVisit; preVisitCheck++) {

int nowVisit = 1<<lastNum;

//지금까지 방문한 숫자 체크(이전까지 방문한 숫자와 지금 방문한 숫자의 or 연산)

int totalVisitCheck = preVisitCheck|nowVisit;   

//152 -> 1523인 경우

if (lastNum > 0 && dp[numLength-1][lastNum-1][preVisitCheck] > 0) {

dp[numLength][lastNum][totalVisitCheck] += dp[numLength-1][lastNum-1][preVisitCheck];

dp[numLength][lastNum][totalVisitCheck] %= modNum;

}

//152 -> 1521인 경우

if (lastNum < 9 && dp[numLength-1][lastNum+1][preVisitCheck] > 0) {

dp[numLength][lastNum][totalVisitCheck] += dp[numLength-1][lastNum+1][preVisitCheck];

dp[numLength][lastNum][totalVisitCheck] %= modNum;

}

}

}

}

int result = 0;

for (int lastNum = 0; lastNum <= 9; lastNum++) {

result += dp[inputNumLength][lastNum][allVisit];

result %= modNum;

}


System.out.println(result);

}

}


'코딩 > 백준 알고리즘' 카테고리의 다른 글

1254. 팰린드롬 만들기  (0) 2019.03.18
2602. 돌다리 건너기  (0) 2019.03.17
Q2352. 반도체 설계  (0) 2019.03.06
Q5582. 공통 부분 문자열  (0) 2019.03.03
Q1038. 감소하는 수  (0) 2019.03.03