[프로그래머스] Lv.0 모스부호(1).java

김엄지·2024년 4월 23일

알고리즘

목록 보기
56/90

🐤 목표

앞으로 매일 꾸준히 코딩테스트를 진행하면서 단계를 높여가보자.

문제 설명

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'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 ≤ letter의 길이 ≤ 1,000
return값은 소문자입니다.
letter의 모스부호는 공백으로 나누어져 있습니다.
letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
해독할 수 없는 편지는 주어지지 않습니다.
편지의 시작과 끝에는 공백이 없습니다.

입출력의 예

.... = h
. = e
.-.. = l
.-.. = l
--- = o
따라서 "hello"를 return 합니다.

문제 풀이 - HashMap을 이용한 경우

import java.util.HashMap;

class Solution {
    public String solution(String letter) {
        String answer = "";
        HashMap<String, Character> morse = new HashMap<>();
        morse.put(".-", 'a');
        morse.put("-...", 'b');
        morse.put("-.-.", 'c');
        morse.put("-..", 'd');
        morse.put(".", 'e');
        morse.put("..-.", 'f');
        morse.put("--.", 'g');
        morse.put("....", 'h');
        morse.put("..", 'i');
        morse.put(".---", 'j');
        morse.put("-.-", 'k');
        morse.put(".-..", 'l');
        morse.put("--", 'm');
        morse.put("-.", 'n');
        morse.put("---", 'o');
        morse.put(".--.", 'p');
        morse.put("--.-", 'q');
        morse.put(".-.", 'r');
        morse.put("...", 's');
        morse.put("-", 't');
        morse.put("..-", 'u');
        morse.put("...-", 'v');
        morse.put(".--", 'w');
        morse.put("-..-", 'x');
        morse.put("-.--", 'y');
        morse.put("--..", 'z');
        
        String[] splitted = letter.split(" ");
        for(String s : splitted) {
            answer += morse.get(s);
        }
        return answer;
    }
}

1) key, value 형태의 자료구조인 HashMap을 이용해서 해당 모스부호에 해당하는 영어 소문자를 저장한다.
2) letter의 모스부호는 공백으로 나누어져 있으니, 문자열을 split(" ")으로 공백을 기준으로 나누어 문자열 splitted에 추가한다.
3) 반복문으로 모스 부호에 대한 알파벳으로 변환하고 answer에 추가한다.
- get() 메서드를 사용하여 모스 부호에 해당하는 알파벳을 가져와 결과에 더한다.

문제 풀이 - 배열에 저장하여 인덱스로 접근한 경우

class Solution {
    public String solution(String letter) {
        String answer = "";
        
        String[] morse = { 
            ".-","-...","-.-.","-..",".","..-.",
            "--.","....","..",".---","-.-",".-..",
            "--","-.","---",".--.","--.-",".-.",
            "...","-","..-","...-",".--","-..-",
            "-.--","--.."
        };
        
        int ascii = 97;
        String[] splitted = letter.split(" ");
        for(String s : splitted) {
            for(int i = 0; i < morse.length; i++) {
                if(morse[i].equals(s)) {
                    answer += (char)(ascii + i);
                }
            }
        }
        return answer;
    }
}

1) 모스 부호를 배열에 저장한다.
2) 영어 소문자 'a'에 해당하는 ASCII 코드 값 저장한다.
3) 문자열 letter의 모스부호는 공백으로 나누어져 있으니, 문자열을 split(" ")으로 공백을 기준으로 나누어 문자열 splitted에 추가한다.
4) 첫 번째 반복문으로 각각의 모스 부호에 대해 반복한다.
5) 두 번째 반복문으로 morse 배열을 돌면서 조건문을 이용해 일치하는 모스 부호를 찾았을 때 해당하는 앞파벳을 결과에 추가한다.
- answer += (char)(ascii + i); : 일치하는 모스 부호를 찾았을 때, 해당하는 알파벳을 ASCII 값에 따라 변환하여 결과에 추가
- ascii는 소문자 'a'의 ASCII 코드 값이고, i는 현재 알파벳이 모스 부호 배열에서 몇 번째 위치에 있는지를 나타낸다.
- (char)를 사용하여 ASCII 코드 값을 해당하는 문자로 변환한다.

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글