본문 바로가기

백준

[백준] 2591 숫자카드

 


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