https://www.acmicpc.net/problem/15874
문제 분석
분류
- 문자열
- 구현
문제 설명
여러분들은 고대 로마의 정치인 율리우스 카이사르를 알고 있는가? 그는 정말 대단한 사람이다! 그는 로마의 독재자로도 유명하지만, 고대 암호의 대표격이라 할 수 있는 카이사르 암호(Caesar Cipher)를 만든 사람이기도 하다.
카이사르 암호는 다음과 같은 방식으로 이뤄진다.
- 알파벳으로 평문을 작성한다.
- 해당 평문을 얼마나 밀지를 결정한다. 민다는 것은, 한 글자를 알파벳 상의 다음 글자로 바꾸는 것을 말한다. 예를 들어 네 번 밀기로 결정했다면, A는 E로, V는 Z로 바뀐다. 만약 Z를 한 번 더 민다면 A가 된다. 이를 표로 나타내면 다음과 같다.원문ABCDE...VWXYZ암호문
E F G H I ... Z A B C D - 평문의 각 글자를 결정한 만큼 밀어서 암호문을 완성한다.
이 방법을 통해 ”I AM JOHN” 이라는 평문을 4글자 밀어 암호문을 작성하면 ”M EQ NSLR”이 된다. 우리는 이를 바탕으로 카이사르 암호 프로그램을 작성하고자 한다. 단, 추가된 점이 조금 있다.
- 알파벳 대문자와 소문자 모두 입력으로 들어온다. 평문의 대문자는 암호문에서도 대문자여야 하고, 평문의 소문자는 암호문에서도 소문자여야 한다.
- 띄어쓰기 외에도 온점(.)과 쉼표(,)가 입력으로 들어온다. 이 둘은 별도의 암호화 과정 없이 원문 그대로 출력하면 된다.
자, 이제 프로그램을 작성해보자.
입력
첫 번째 줄에는 다음 알파벳으로 밀 횟수 k(1 ≤ k ≤ 10,000,000), 그리고 문자열 s의 길이 |s|(1 ≤ |s| ≤ 100,000)가 입력으로 들어온다.
두 번째 줄에는 알파벳 소문자, 대문자, 공백 문자, 그리고 온점(.)과 쉼표(,) 로 이루어진 문자열 s가 들어온다.
출력
문자열 s를 k번 민 결과물을 출력한다. 단, 알파벳 소문자가 대문자로 바뀌어 있거나 대문자가 소문자로 바뀌어 있으면 안 된다. 또한 공백 문자와 온점, 쉼표는 그대로 출력되어야 한다.
소스코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
k %= 26;
StringBuilder sb = new StringBuilder();
char[] word = br.readLine().toCharArray();
for (int i = 0; i < s; i++) {
if (word[i] == ',' || word[i] == '.' || word[i] == ' ') {
sb.append(word[i]);
} else if (word[i] >= 65 && word[i] <= 90 && word[i] + k > 90) {
sb.append((char) (64 + (word[i] + k - 90)));
} else if (word[i] >= 97 && word[i] <= 122 && word[i] + k > 122) {
sb.append((char) (96 + (word[i] + k - 122)));
} else sb.append((char) (word[i] + k));
}
System.out.println(sb);
}
}
문제풀이
- BufferReader 사용해 밀 횟수와 문자열의 길이를 받아준다
- 밀 횟수는 영어 단어가 26개이므로 26으로 나눈 나머지로 변환해준다.
- 온점, 반점, 띄어쓰기의 경우 밀지 않고 유지해준다.
- 대문자, 소문자를 판단해 민 이후의 결과가 알파벳의 범위를 벗어난다면 앞에서부터 다시 세어준다.
- 민 결과를 StringBuilder에 저장했다가 출력해준다.
'Koala - 14기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/Java] 11383번 : 뚊 (0) | 2024.05.13 |
---|---|
[백준/Python] 8989번 시계 (0) | 2024.05.12 |
[백준/Python] 5430번 AC (0) | 2024.05.05 |
[백준/Python3] 10798번 세로읽기 (0) | 2024.05.05 |
[백준/Java] 1181번 : 단어정렬 (0) | 2024.04.15 |