[99클럽 5일차] [백준] 29701 모스 부호

Dev.Dana·2024년 11월 1일
0

Algorithm

목록 보기
10/25
post-thumbnail

[백준] 모스 부호

모스부호 문제를 보자마자 든 생각. 아.. 귀찮다..

java에서 모스부호로 변환해주는 내장 메서드 같은 건 없을까? → 없었음

별의 별게 다 있던데 왜 없지? → 모스 부호는 특정 응용 분야에서만 다루는 내용이기 때문에… 아니 사실 암호를 변환해주는 메소드가 있으면 안되긴 하지.. 아무리 유명한 암호라고 해도ㅠㅠㅋㅋ

어쨌든 문제로 다시 돌아가서…

문제

모스 부호로 작성된 문자열을 입력받아 해당 부호를 영어 알파벳이나 숫자로 변환하는 기능을 구현

해결방법

  1. 모스 부호와 대응하는 알파벳 + 숫자 + 기호 의 매핑 테이블을 준비한다.
  2. 입력된 모스부호 arr에서 하나씩 순차적으로 꺼내서 매핑된 값을 찾아 복호화 한다.

문제는 정말 간단하다. 그냥 단순히 map에 하나씩 넣는 과정이 괴로울 뿐 🥲

import java.io.*;
import java.util.HashMap;

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        String input = br.readLine();
        String[] arr = input.split(" ");

        HashMap<String, Character> morseToChar = new HashMap<>();

        morseToChar.put(".-", 'A');
        morseToChar.put("-...", 'B');
        morseToChar.put("-.-.", 'C');
        morseToChar.put("-..", 'D');
        morseToChar.put(".", 'E');
        morseToChar.put("..-.", 'F');
        morseToChar.put("--.", 'G');
        morseToChar.put("....", 'H');
        morseToChar.put("..", 'I');
        morseToChar.put(".---", 'J');
        morseToChar.put("-.-", 'K');
        morseToChar.put(".-..", 'L');
        morseToChar.put("--", 'M');
        morseToChar.put("-.", 'N');
        morseToChar.put("---", 'O');
        morseToChar.put(".--.", 'P');
        morseToChar.put("--.-", 'Q');
        morseToChar.put(".-.", 'R');
        morseToChar.put("...", 'S');
        morseToChar.put("-", 'T');
        morseToChar.put("..-", 'U');
        morseToChar.put("...-", 'V');
        morseToChar.put(".--", 'W');
        morseToChar.put("-..-", 'X');
        morseToChar.put("-.--", 'Y');
        morseToChar.put("--..", 'Z');
        morseToChar.put(".----", '1');
        morseToChar.put("..---", '2');
        morseToChar.put("...--", '3');
        morseToChar.put("....-", '4');
        morseToChar.put(".....", '5');
        morseToChar.put("-....", '6');
        morseToChar.put("--...", '7');
        morseToChar.put("---..", '8');
        morseToChar.put("----.", '9');
        morseToChar.put("-----", '0');
        morseToChar.put("--..--", ',');
        morseToChar.put(".-.-.-", '.');
        morseToChar.put("..--..", '?');
        morseToChar.put("---...", ':');
        morseToChar.put("-....-", '-');
        morseToChar.put(".--.-.", '@');

        StringBuilder sb = new StringBuilder();

        for(String str : arr){
            sb.append(morseToChar.get(str));
        }

        bw.write(sb.toString());

        bw.flush();
        bw.close();
        br.close();
    }
}

오늘 문제는 HashMap의 사용법만 정확히 알면 쉽게 풀리는 문제였다.

다른사람의 풀이 확인하기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		
		String[] s = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "--..--", ".-.-.-", "..--..", "---...", "-....-", ".--.-."};
		String[] ans = {"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", ",", ".", "?", ":", "-", "@"};
		
		br.readLine();
		
		StringBuilder sb = new StringBuilder();
		for(String str : br.readLine().split(" ")) {
			for(int i = 0; i < s.length; i++) {
				if(s[i].equals(str)) {
					sb.append(ans[i]);
					break;
				}
			}
		}
		System.out.print(sb);
	}
}
  • HashMap 없이 단순 배열을 사용해서 변환이 이뤄져서 코드가 간단해 보인다.
  • 입력부도 저렇게 짧게 바로 for문에 넣어도 된다는 것을 알게 되었다!!

여담

프로그래머스 문제들만 풀어보다가 백준 풀어보려니까 조금 당황스러웠다. 입력받는 부분을 내가 직접 구현해줘야한다.

백준에선 실행시간도 중요하기 때문에 초과하지 않도록 유의해가며 문제를 풀어야한다.

📌 Scanner 대신 BufferedReader를
📌 print문 대신 BufferedWriter를 사용해야 시간이 단축된다.
내 코드로 확인 했을 땐 대략 2배정도 빨랐는데 보통 3-4배까지도 빠르다고 한다.
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글