일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java
- 브루트포스
- BFS
- 백준
- 동적계획법
- JavaScript
- 2018 KAKAO BLIND RECRUITMENT
- 유니온파인드
- 호이스팅
- VAR
- 삼성SW역량테스트
- 2022 KAKAO BLIND RECRUITMENT
- 코틀린
- 자바스크립트
- 컴퓨터 비전
- 누적합
- Lv3
- lv2
- level2
- 2023 KAKAO BLIND RECRUITMENT
- 자바
- const
- 구현
- kotlin
- 컴퓨터비전
- 프로그래머스
- dp
- level3
- 2021 KAKAO BLIND RECRUITMENT
- js
Archives
- Today
- Total
코드를 느껴바라
2011번 : 암호코드 [JAVA] 본문
반응형
암호코드 링크
문제
상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다.
- 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야.
- 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어.
- 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" 총 6가지가 나오는데, BEAN이 맞는 단어라는건 쉽게 알수 있잖아?
- 선영: 예가 적절하지 않았네 ㅠㅠ 만약 내가 500자리 글자를 암호화 했다고 해봐. 그 때는 나올 수 있는 해석이 정말 많은데, 그걸 언제 다해봐?
- 상근: 얼마나 많은데?
- 선영: 구해보자!
어떤 암호가 주어졌을 때, 그 암호의 해석이 몇 가지가 나올 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 5000자리 이하의 암호가 주어진다. 암호는 숫자로 이루어져 있다.
출력
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다.
암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
예제 입력 1 복사
25114
예제 출력 1 복사
6
예제 입력 2 복사
1111111111
예제 출력 2 복사
89
성공 여부(걸린 시간): 실패(56분) -> 반례보다가 코드를 봐버림
아이디어
처음에 시작은 순조로웠다. 일단 점화식은 잘 작성했는데
앞 숫자가 1~2라면
DP[i] = Math.max(DP[i-1]+DP[i-2], DP[i]);
아니면 그대로
그런데 왜 이렇게 많이 틀렸나 궁금할 것이다.
만약 2101이란 숫자가 있다면
내가 이해한 그대로라면 [2, 10, 1], [21, 01] 이런식으로 01도 1아닌가? 생각을 했으나 이렇게 풀면 안되는 것이었다.
01 02 이건 불가능하다는점 확실히 하고 풀면 좋을듯
그 외에도 기본적인 로직에서 추가로 예외 처리들을 해주어야 했는데 크게 생각할것은 아래와 같다.
- 일단 시작이 0인 경우는 무조건 불가능한 암호이다.(01,02 이런건 없다.)
- 마지막 글자가 0인데 그 앞글자가 0이나 3이상의 수라면 0을 불가능한 암호이다.
- 불가능한 수가 아닐 경우에 앞의 숫자가 3 이상이거나 0이라면 그냥 이전 저장값을 그대로 넣어준다.
- 만약 10, 20이 아니고 2자리 수가 가능하면 점화식적용
- 10이나 20인 경우는 그 자체로 하나의 경우밖에 없기에 i-2번째 dp값 넣어준다.
정답 코드
import java.io.*;
class Main{
public static void main(String [] args)throws IOException{
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
String code = br.readLine();
//시작하기에 앞서 무조건 안되는 경우 처리
if(code.charAt(0)=='0'||(code.charAt(code.length()-1)=='0'&&code.charAt(code.length()-2)-'0'>2)){
System.out.print(0);
return;
}
int [] dp = new int[code.length()+1];
dp[0] = 1;
dp[1] = 1;
for(int i=2; i<=code.length(); i++){
dp[i] = dp[i-1];
int x = Integer.parseInt(code.substring(i-2, i));
if(x==0||x%10==0&&x/10>=3){//0이나 30
System.out.print(0);
return;
}
else if(x<=26&&x>=10){
if(x==10||x==20){
dp[i]=dp[i-2];
}
else{
dp[i]= Math.max(dp[i], dp[i-2]+dp[i-1])%1000000;
}
}
}
System.out.print(dp[code.length()]);
}
}
반응형
'PS > 백준(Baekjoon)' 카테고리의 다른 글
17471번 : 게리맨더링 [JAVA] (0) | 2025.03.18 |
---|---|
7569번 : 토마토 [JAVA] (0) | 2025.03.05 |
2151번 : 거울 설치 [JAVA] (0) | 2025.02.20 |
6593번 : 상범 빌딩 [JAVA] (0) | 2025.02.18 |
9328번 : 열쇠 [JAVA] (1) | 2025.02.17 |