문제 출처 : https://www.acmicpc.net/problem/15874
언어 : Kotlin
문제 설명 :
여러분들은 고대 로마의 정치인 율리우스 카이사르를 알고 있는가? 그는 정말 대단한 사람이다! 그는 로마의 독재자로도 유명하지만, 고대 암호의 대표격이라 할 수 있는 카이사르 암호(Caesar Cipher)를 만든 사람이기도 하다.
카이사르 암호는 다음과 같은 방식으로 이뤄진다.
알파벳으로 평문을 작성한다.
해당 평문을 얼마나 밀지를 결정한다. 민다는 것은, 한 글자를 알파벳 상의 다음 글자로 바꾸는 것을 말한다. 예를 들어 네 번 밀기로 결정했다면, A는 E로, V는 Z로 바뀐다. 만약 Z를 한 번 더 민다면 A가 된다. 이를 표로 나타내면 다음과 같다.
원문 A B C D E ... V W X Y Z
암호문 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번 민 결과물을 출력한다. 단, 알파벳 소문자가 대문자로 바뀌어 있거나 대문자가 소문자로 바뀌어 있으면 안 된다. 또한 공백 문자와 온점, 쉼표는 그대로 출력되어야 한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 64MB
입출력 예 :
입력 | 출력 |
4 10 I AM JOHN. |
M EQ NSLR. |
26 10 I AM JOHN. |
I AM JOHN. |
5 37 I love Red Black Tree, how about you. |
N qtaj Wji Gqfhp Ywjj, mtb fgtzy dtz. |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (k, l) = readLine().split(" ").map { it.toInt() }
val sb = StringBuilder()
readLine().forEach {
val cur = it.code + (k % 26)
if (it.isUpperCase()) {
sb.append(if (cur > 90) (cur - 26).toChar() else cur.toChar())
} else if (it.isLowerCase()) {
sb.append(if (cur > 122) (cur - 26).toChar() else cur.toChar())
} else {
sb.append(it)
}
}
bw.write(sb.toString())
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
31306번: Is Y a Vowel? (0) | 2024.08.05 |
---|---|
21966번: (중략) (0) | 2024.08.05 |
4821번: 페이지 세기 (0) | 2024.08.02 |
10931번: SHA-384 (0) | 2024.08.02 |
13506번: 카멜레온 부분 문자열 (0) | 2024.08.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!