항해 99클럽 코테

99클럽 코테 스터디 5일차 TIL

metamong-data 2024. 11. 1. 17:58
728x90
반응형

오늘의 학습 키워드

해시

과제

혜민이는 요즘 모스 부호에 관심이 많아졌다. 모스 부호는 짧은 신호와 긴 신호를 적절히 조합하여 문자 기호를 표기하는 방식이다. 각 문자를 나타내는 방식은 미리 정해져 있는데, 예를 들어, 짧은 신호를 '.', 긴 신호를 '-'로 나타낸다면, 모스 부호로 알파벳 'A'는 '.-', 숫자 1은 '.----'와 같이 표기할 수 있다. 모스 부호를 알고 있으면 위험한 상황에서 구조 요청을 하는 데 유용할 것 같아, 혜민이는 평상시에 친구들과 연락을 주고받을 때도 모스 부호를 사용하려고 한다. 혜민이는 친구들이 보내온 모스 부호를 올바르게 해독했는지 바로바로 확인하고 싶어졌다. 알파벳 A-Z, 숫자 0-9, 기호 ',', '.', '?', ':', '-', '@'로 이루어진 길이 N$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 -----
, --..-- . .-.-.-
? ..--.. : ---...
- -....- @ .--.-.

풀이 과정

  1. 입력으로 들어온 문자열의 최대 길이까지 while문으로 반복
  2. 현재 문자가 isdigit()를 이용하여 숫자인지 확인하고 숫자이면 그대로 answer에 추가
  3. 아닐 경우 number 딕셔너리의 각 키(key)를 순회
  4. 현재 위치부터 시작하는 부분 문자열이 해당 단어로 시작하는지 확인 후 단어가 있을 경우 answer에 추가

제출 코드 (python)

morse_code = {
    ".-": "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 = int(input())
morse = input().split()
result = ""
for i in range(N):
    result += morse_code[morse[i]]
print(result)

다른 언어로 문제 풀기

GO 언어

package main

import (
    "bufio"
    "fmt"
)

func main() {
    morseCode := map[string]string{
        ".-":     "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",
        "--..--": ",",
        ".-.-.-": ".",
        "..--..": "?",
        "---...": ":",
        "-....-": "-",
        ".--.-.": "@",
    }

    var N int
    fmt.Scan(&N)

    scanner := bufio.NewScanner(bufio.NewReader(stdin))
    scanner.Scan()
    morse := strings.Fields(scanner.Text())

    result := ""
    for i := 0; i < N; i++ {
        result += morseCode[morse[i]]
    }
    
    fmt.Println(result)
}

C++

#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <vector>
using namespace std;

int main() {
    map<string, string> morseCode = {
        {".-", "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"},
        {"--..--", ","},
        {".-.-.-", "."},
        {"..--..", "?"},
        {"---...", ":"},
        {"-....-", "-"},
        {".--.-.", "@"}
    };

    int N;
    cin >> N;
    cin.ignore(); // 버퍼 비우기

    string line;
    getline(cin, line);
    
    stringstream ss(line);
    vector<string> morse;
    string temp;
    
    while (ss >> temp) {
        morse.push_back(temp);
    }

    string result = "";
    for (int i = 0; i < N; i++) {
        result += morseCode[morse[i]];
    }
    
    cout << result << endl;
    
    return 0;
}

오늘의 회고

  • 어제와 비슷한 문제를 풀다 보니 이해도 되고 쉬웠다!

출처 : https://www.acmicpc.net/problem/29701

728x90