29701번: 모스 부호
문제 출처 : https://www.acmicpc.net/problem/29701
언어 : Kotlin
문제 설명 :
혜민이는 요즘 모스 부호에 관심이 많아졌다. 모스 부호는 짧은 신호와 긴 신호를 적절히 조합하여 문자 기호를 표기하는 방식이다. 각 문자를 나타내는 방식은 미리 정해져 있는데, 예를 들어, 짧은 신호를 '.', 긴 신호를 '-'로 나타낸다면, 모스 부호로 알파벳 'A'는 '.-', 숫자 1은 '.----'와 같이 표기할 수 있다. 모스 부호를 알고 있으면 위험한 상황에서 구조 요청을 하는 데 유용할 것 같아, 혜민이는 평상시에 친구들과 연락을 주고받을 때도 모스 부호를 사용하려고 한다. 혜민이는 친구들이 보내온 모스 부호를 올바르게 해독했는지 바로바로 확인하고 싶어졌다. 알파벳 A-Z, 숫자 0-9, 기호 ',', '.', '?', ':', '-', '@'로 이루어진 길이
$N$인 문자열을 변환한 모스 부호가 주어질 때, 주어진 모스 부호를 해독하여 원래의 문자열을 출력하는 프로그램을 작성해 보자.
각 문자를 모스 부호로 나타내는 방법은 아래 표에 정리되어 있다. (단, 표의 둘째, 넷째 열은 첫째, 셋째 열의 문자를 모스 부호로 변환한 결과를 나타내며, '.'는 짧은 신호를, '-'는 긴 신호를 의미한다.)
A | .- | B | -... |
C | -.-. | D | -.. |
E | . | F | ..-. |
G | --. | H | .... |
I | .. | J | .--- |
K | -.- | L | .-.. |
M | -- | N | -. |
O | --- | P | .--. |
Q | --.- | R | .-. |
S | ... | T | - |
U | ..- | V | ...- |
W | .-- | X | -..- |
Y | -.-- | Z | --.. |
1 | .---- | 2 | ..--- |
3 | ...-- | 4 | ....- |
5 | ..... | 6 | -.... |
7 | --... | 8 | ---.. |
9 | ----. | 0 | ----- |
, | --..-- | . | .-.-.- |
? | ..--.. | : | ---... |
- | -....- | @ | .--.-. |
입력 :
첫째 줄에 모스 부호로 변환하기 전 문자열의 길이를 나타내는 정수 N(1 ≤ N ≤ 100)이 주어진다.
둘째 줄에 원래의 문자열을 모스 부호로 변환한 메시지가 주어진다. 이 메시지에서 짧은 신호는 '.', 긴 신호는 '-'로 나타내며, 원래의 문자열을 구성하는 각각의 문자를 모스 부호로 변환한 결과는 공백으로 구분되어 있다.
위 표를 이용해 해독할 수 없는 메시지는 주어지지 않는다.
출력 :
주어진 모스 부호를 해독하여 길이 N인 문자열을 공백 없이 출력한다.
알파벳의 경우, 반드시 대문자로 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 1024MB
입출력 예 :
입력 | 출력 |
5 .... . .-.. .-.. --- |
HELLO |
풀이 :
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val morseChar = mapOf(
Pair('A', ".-"), Pair('B', "-..."), Pair('C', "-.-."), Pair('D', "-.."), Pair('E', "."),
Pair('F', "..-."), Pair('G', "--."), Pair('H', "...."), Pair('I', ".."), Pair('J', ".---"),
Pair('K', "-.-"), Pair('L', ".-.."), Pair('M', "--"), Pair('N', "-."), Pair('O', "---"),
Pair('P', ".--."), Pair('Q', "--.-"), Pair('R', ".-."), Pair('S', "..."), Pair('T', "-"),
Pair('U', "..-"), Pair('V', "...-"), Pair('W', ".--"), Pair('X', "-..-"), Pair('Y', "-.--"),
Pair('Z', "--..")
)
val morseNumber = mapOf(
Pair(0, "-----"), Pair(1, ".----"), Pair(2, "..---"), Pair(3, "...--"), Pair(4, "....-"),
Pair(5, "....."), Pair(6, "-...."), Pair(7, "--..."), Pair(8, "---.."), Pair(9, "----.")
)
val morseSymbol = mapOf(
Pair(',', "--..--"), Pair('.', ".-.-.-"), Pair('?', "..--.."), Pair(':', "---..."), Pair('-', "-....-"),
Pair('@', ".--.-.")
)
val n = readLine().toInt()
val morse = readLine().split(" ").map {
when (it.length) {
6 -> morseSymbol.entries.find { map -> map.value == it }?.key
5 -> morseNumber.entries.find { map -> map.value == it }?.key
else -> morseChar.entries.find { map -> map.value == it }?.key
}
}
bw.write(morse.joinToString(""))
bw.flush()
bw.close()
}