문제 설명
혜민이는 요즘 모스 부호에 관심이 많아졌다. 모스 부호는 짧은 신호와 긴 신호를 적절히 조합하여 문자 기호를 표기하는 방식이다. 각 문자를 나타내는 방식은 미리 정해져 있는데, 예를 들어, 짧은 신호를 '.
', 긴 신호를 '-
'로 나타낸다면, 모스 부호로 알파벳 '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) , (1≤N≤100)이 주어진다.
둘째 줄에 원래의 문자열을 모스 부호로 변환한 메시지가 주어진다. 이 메시지에서 짧은 신호는 '.
', 긴 신호는 '-
'로 나타내며, 원래의 문자열을 구성하는 각각의 문자를 모스 부호로 변환한 결과는 공백으로 구분되어 있다.
위 표를 이용해 해독할 수 없는 메시지는 주어지지 않는다.
### 출력
주어진 모스 부호를 해독하여 길이 N
인 문자열을 공백 없이 출력한다.알파벳의 경우, 반드시 대문자로 출력한다.
<내코드>
- 코드
import sys
mos_dict = {
"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":"-----",
",": "--..--", ".":".-.-.-", "?":"..--..", ":" :"---...", "-": "-....-", "@":".--.-."}
mos_dict_inverse= {v : k for k , v in mos_dict.items()}
T = int(sys.stdin.readline())
list = list(map(str, sys.stdin.readline().split()))
for i in range(T):
list[i] = mos_dict_inverse[list[i]]
print("".join(list))
import sys
sys.stdin.readline()
백준에서 할 때 필수적인 내용임 잊지 말자
- 반성
1. 쉬워보여서 먼저 방향성 안정하고 바로 풀어버림
-> 오히려 주먹구구식 개발로 시간이 더 쓰임
<모범사례>
import sys
# 모스 부호 딕셔너리 정의
mos_dict = {
"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": "-----",
",": "--..--", ".": ".-.-.-", "?": "..--..", ":": "---...", "-": "-....-", "@": ".--.-."
}
# 모스 부호 해독용 딕셔너리 (키와 값을 반전시킴)
mos_dict_inverse = {v: k for k, v in mos_dict.items()}
# 주어진 모스 부호 메시지를 해독하는 함수
def solution(n, message):
# 공백으로 분리된 모스 부호 메시지를 하나씩 해독하여 문자열로 결합
return "".join([mos_dict_inverse[m] for m in message.split()])
# 메인 코드: 입력 처리 및 결과 출력
if __name__ == "__main__":
# 첫 줄 입력: 문자열의 길이
n = int(sys.stdin.readline().strip())
# 둘째 줄 입력: 모스 부호 메시지
message = sys.stdin.readline().strip()
# 해독 결과 출력
print(solution(n, message))
- 그냥 백준식으로 input을 받는다고만 생각해서 list로 받아버림 그대로 문자열로 받아도 됨
- list(map()) 굳이 안써도 됨
-> 이렇게 하면 list로 안담고 곧바로 문자열에다가 split()로 한번에 해결이 가능함
- 리스트 컴프리헨션 이 아직도 낯설음
<보충학습>
split()
딕셔너리 반전
'문제풀이 > 일일연습문제' 카테고리의 다른 글
[hash]99클럽 코테 스터디 7일차 TIL + 백준/Bronze/31562. 전주 듣고 노래 맞히기 (0) | 2024.11.04 |
---|---|
[hash]99클럽 코테 스터디 6일차 TIL + 백준/Bronze/27160. 할리갈리 (0) | 2024.11.03 |
[string]99클럽 코테 스터디 4일차 TIL + 프로그래머스/1/81301. 숫자 문자열과 영단어 (1) | 2024.11.01 |
[string]99클럽 코테 스터디 3일차 TIL + 프로그래머스/1/147355. 크기가 (0) | 2024.10.31 |
[string]99클럽 코테 스터디 2일차 TIL + 프로그래머스/1/147355. 크기가 작은 부분문자열/ (0) | 2024.10.30 |