문제 출처 : https://www.acmicpc.net/problem/1718
언어 : Kotlin
문제 설명 :
Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.
예를 들어 암호화 키가 love이고, 암호화할 문장이 “nice day” 라면 다음과 같이 암호화가 이루어진다.
제시된 평문의 첫 번째 문자인 ‘n’은 해당 암호화 키 ‘l’의 알파벳 순서가 12 이므로 알파벳상의 순서에서 ‘n’보다 12앞의 문자인 ‘b’로 변형된다.
변형된 문자가 ‘a' 이전의 문자가 되면 알파벳 상에서 맨 뒤로 순서를 돌린다. 예를 들면 평문의 세 번째 문자인‘c’는 알파벳 상에서 3 번째이고 대응하는 암호화키 ‘v'는 알파벳 순서 22로 ‘c'에서 22 앞으로 당기면 ‘a'보다 훨씬 앞의 문자이어야 하는데, ‘a’앞의 문자가 없으므로 ‘z’로 돌아가 반복되어 ‘g’가 된다. 즉 평문의 문자를 암호화키의 문자가 알파벳 상에서 차지하는 순서만큼 앞으로 뺀 것으로 암호화한다.
평문의 문자가 공백 문자인 경우는 그 공백 문자를 그대로 출력한다.
이와 같은 암호화를 행하는 프로그램을 작성하시오.
입력 :
첫째 줄에 평문이, 둘째 줄에 암호화 키가 주어진다.
평문은 알파벳 소문자와 공백문자(space)로만 구성되며, 암호화 키는 알파벳 소문자만으로 구성된다. 평문의 길이는 공백까지 포함해서 30000자 이하이다.
출력 :
첫 번째 줄에 암호문을 출력한다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
nice day love |
btgz oet |
풀이 :
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))
var idx = 0
val str = readLine()
val sb = StringBuilder()
val pass = readLine().map { it.code }
for (i in str) {
if (idx > pass.lastIndex) idx = 0
if (i != ' ') {
var temp = i.code - pass[idx]
while (true) {
if (temp in 1 .. 26) break
if (temp < 1) temp += 26
if (temp > 26) temp -= 26
}
sb.append((temp + 96).toChar())
idx++
} else {
sb.append(" ")
idx++
continue
}
}
bw.write(sb.toString())
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
2800번: 괄호 제거 (0) | 2024.03.04 |
---|---|
12813번: 이진수 연산 (0) | 2024.03.04 |
1864번: 문어 숫자 (0) | 2024.03.01 |
3613번: Java vs C++ (0) | 2024.03.01 |
18409번: 母音を数える (Counting Vowels) (0) | 2024.03.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!