새소식

Programmers Coding Test/Java

[프로그래머스 120838] Java - 코딩테스트 입문 / 모스부호 (1)

  • -

 

 

모스부호 (1)

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120838

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

1)  문제

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 
그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 
문자열 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에 공백은 연속으로 두 개 이상 존재하지 않습니다.
해독할 수 없는 편지는 주어지지 않습니다.
편지의 시작과 끝에는 공백이 없습니다.

 

 

 

 

2)  예시

 

 

Result Table
letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

 

 

 

입출력 예 설명
입출력 예 #1
.... = h
. = e
.-.. = l
.-.. = l
--- = o
따라서 "hello"를 return 합니다.


입출력 예 #2
.--. = p
-.-- = y
- = t
.... = h
--- = o
-. = n
따라서 "python"을 return 합니다.

 


a ~ z에 해당하는 모스부호가 순서대로 담긴 배열입니다.
{".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}

 

 

 

 

 

3)  풀이

 

 

0. java utility의 HashMap 클래스를 import 해줍니다.

● import java.util.HashMap;

 

※ HashMap 이란?

java에서 테이블 기반의 맵 구현으로, 키와 값 쌍을 저장하고, 키를 기반으로 값을 검색, 삽입, 삭제하는 데 사용됩니다.

이 때, 각 키는 고유해야합니다.

  • put(key, value): 지정된 키와 값을 맵에 추가합니다.
    만약 동일한 키가 이미 맵에 존재한다면, 해당 키의 값을 새 값으로 대체합니다.
  • get(key): 지정된 키에 매핑된 값을 반환합니다. 만약 맵에 해당 키가 없으면 null을 반환합니다.
  • remove(key): 지정된 키와 이에 대응하는 값을 맵에서 제거합니다.
  • containsKey(key): 지정된 키가 맵에 있는지 여부를 반환합니다.
  • size(): 맵의 현재 크기(키-값 쌍의 수)를 반환합니다.
  • isEmpty(): 맵이 비어 있는지 여부를 반환합니다.
  • clear(): 맵의 모든 요소를 제거하여 비웁니다.
  • keySet(): 맵에 있는 모든 키를 포함하는 Set을 반환합니다.

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 문자열 letter를 매개변수로 하는 solution 메소드를 선언합니다.

solution은 문자열을 반환하므로 데이터타입을 String으로 합니다.

●  public String solution(String letter) {

 

 

 

 

3. 문자열 length에 대한 제한사항을 검사합니다. 제한사항을 만족하지 않을 경우, 예외처리합니다.

     if (letter.length() < 1 || letter.length() > 1000) {
            throw new IllegalArgumentException("letter는 1 이상 1000 이하여야 합니다.");
        }

 

 

 

 

4. 문자배열 morseCodes를 선언해줍니다. 아래 { } 안의 내용은 제시된 문제에서 제공되고 있습니다.

     String[] morseCodes = {
            ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
            "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", 
            "..-", "...-", ".--", "-..-", "-.--", "--.."
        };

 

 

 

 

5. Key를 문자열로, Value를 문자로 가지는 HashMap인 morseMap을 생성해줍니다.

알파벳은 아스키코드 a(97)에 i가 0부터 morseCodes의 길이만큼 순회하며 더해져서 만들어지고,

a - z 까지의 알파뱃을 각 모스코드를 키로 하는 value로 가지게 합니다.

      HashMap<String, Character> morseMap = new HashMap<>();
        for (int i = 0; i < morseCodes.length; i++) {
            char alphabet = (char)('a' + i);
            morseMap.put(morseCodes[i], alphabet);
        }

 

 

아스키코드 알파벳

아스키코드 알파벳
a97 b98 c99 d100 e101 f102 g103
h104 i105 j106 k107 l108 m109 n110
o111 p112 q113 r114 s115 t116 u117
v118 w119 x120 y121 z122

 

 

 

 

 

 

6. 매개변수인 문자열 letter를 " " (공백 한칸)로 나누어서 문자배열 words에 저장시킵니다.

즉, 모스코드에 띄어쓰기때마다 하나의 원소로 저장되는 것이죠.

StringBuilder를 이용하여 결과를 저장할 result를 선언해주고,
words 단어를 순회하며 각 word(분리된 모스코드)에 해당하는 morseMap 값을 가지고와서 result에 더해줍니다.

최종적으로 StringBuilder 객체인 result를 String으로 형변환해준 후 반환합니다.

    String[] words = letter.split(" ");
        StringBuilder result = new StringBuilder();
        for (String word : words) {
            result.append(morseMap.get(word));
        }
        
        return result.toString();
    }
}

 

 

 

※ 향상된 for문을 풀어낸다면

  for (String word : words) {
            result.append(morseMap.get(word));
        }

위 코드는 아래 코드와 같은 역할을 합니다..

  for (int i = 0; i < words.length; i++) {
            result.append(morse.get(words[i]));
        }

 

 

 

 

 

 

 

4)  코드

 

import java.util.HashMap;

class Solution {
    public String solution(String letter) {
        if (letter.length() < 1 || letter.length() > 1000) {
            throw new IllegalArgumentException("letter는 1 이상 1000 이하여야 합니다.");
        }
        
        String[] morseCodes = {
            ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
            "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", 
            "..-", "...-", ".--", "-..-", "-.--", "--.."
        };
        
        HashMap<String, Character> morseMap = new HashMap<>();
        for (int i = 0; i < morseCodes.length; i++) {
            char alphabet = (char)('a' + i);
            morseMap.put(morseCodes[i], alphabet);
        }
        
        String[] words = letter.split(" ");
        StringBuilder result = new StringBuilder();
        for (String word : words) {
            result.append(morseMap.get(word));
        }
        
        return result.toString();
    }
}

 

 

 

● 아래는 직접 put 하나씩 입력하여 풀이한 방식.

하지만 문제에서 이용할 수 있는 문자배열을 주었기때문에 위의 코드로 풀었습니다.

import java.util.HashMap;

class Solution {
    public String solution(String letter) {
        
        if(1> letter || letter > 1000){
            throw new IllegalArgumentException("letter은 1 이상 1000 이하입니다.");
        }
        
        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[] words = letter.split(" ");
        StringBuilder result = new StringBuilder();
        for (String word : words) {
            result.append(morse.get(word));
        }
        
        return result.toString();
    }
}

 

 

 

 

 

 

 

 

 

 

 

5)  느낀점

이전에 풀었던 다른 문제에서 'a' 아스키코드를 사용할 일이 있었지만,

만약에 'a'에 대해 몰랐을 경우를 대비하여 아스키코드를 사용하지 않는 쪽으로 문제를 풀었습니다.

 

문자배열로 나열된 값을 1씩 더해주며 알파벳으로 변환해줄 방법을 고민했지만, 결국 아스키코드를 이용한 방식이 금번 문제에서 제일 적합하다고 생각했습니다, 그래서 아스키코드에 대해 알아봤는데 아주 유용했습니다... 무지막지하게 외워야할 것만 같아 피했던 제가 어리석었습니다. 

 

HashMap에 대해서도 헷갈렸던 개념이 잘 잡히는 좋은 문제였습니다.

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.