https://mygumi.tistory.com/291
백준 2591번 숫자카드 :: 마이구미
이 글은 백준 알고리즘 문제 2591번 "숫자카드" 를 풀이한다. 정올 출제 문제로써, 풀이 방법은 동적계획법을 통해 해결한다. 문제 링크 - https://www.acmicpc.net/problem/2591 1부터 34까지 수가 적힌 카드
mygumi.tistory.com
https://www.acmicpc.net/board/view/62104
글 읽기 - 이 문제의 다양한 함정들
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] array = br.readLine().toCharArray(); //1칸씩 나눠받고
int len = array.length; //정수 길이
int[][] dp = new int[41][3]; //최대 40자 이하의 정수, 일의 자리와 십의 자리 구별
dp[1][1] = 1; //한자리 수는 무조건 1이다// 첫번째 글자의 일의 자리 카드는 1
int prev = (array[0] - '0') * 10; //첫번째가 십의 자리수일때를 계산할 때 쓴다
for(int i = 2; i<=len; i++) { //2번째 자리부터 시작 첫번째 자리는 이미 prev로 계산되어 있고 한자리 숫자만 온다면 1로 값을 출력
int v = (array[i-1] - '0'); //array는 0부터 시작한다
if(v == 0) {
if (prev + v <= 34) {
dp[i][2] = dp[i - 1][1]; //이 경우 0이 단독으로 올 수 없기 때문에 무조건 0을 포함해서 2자리가 와야 한다
}
continue;
}
if(prev + v <= 34) {
dp[i][1] = dp[i-1][1] + dp[i-1][2]; //만약 123이라면 12에서 3이 붙은 것이기 때문에 1 2의 1개와 12의 1개 총 2개를 가져와야 한다 (1 2 3, 12 3)
dp[i][2] = dp[i-1][1];
//dp[3][2]의 경우 dp[2][1]이다 123은 dp[3][1] + dp[3][2]이다 dp[3][1]은 2에 해당하고 dp[3][2]는 1에 해당한다
//dp[2][1] = 1이고 dp[2][2]는 = 1이다 여기서 12는 1 2와 12가 올 수 있다 3이 늘어났으면 이 3이 단독으로 오는 값은 1 2 3 12 3 에 해당한다
//dp[3][2]는 1이 고정이기 때문에 전의 dp[전][1]을 불러와야한다
}
else {
dp[i][1] = dp[i-1][1] + dp[i-1][2];
}
prev = v * 10;
}
System.out.println(dp[len][1] +dp[len][2]);
}
}
'백준' 카테고리의 다른 글
[백준] 15686 치킨배달 (0) | 2021.10.29 |
---|---|
[백준] 14889 스타트와 링크 (0) | 2021.10.27 |
1654 랜선 자르기 (0) | 2021.10.23 |
10869 사칙연산 (0) | 2021.10.18 |
5585 거스름돈 (0) | 2021.10.14 |