본문 바로가기
개발/개발 공부

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

by 하모예 2024. 10. 2.

| 문제

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다.

그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다.

문자열 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에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다. 

| 입출력 예

letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

| 힌트

"문제에 답이 있다"는 말 아시나요? 

학교 다닐때 선생님들께서 많이 하시던 말씀인데요. 

모스부호(1) 문제도 자세히 지문을 보시면 그 속에서 해답을 찾을 수 있습니다.

제한사항에 letter의 모스부호는 공백으로 나누어져 있다는 문장이 있어요. 

그렇기 때문에 공백을 기준으로 문자열을 잘라서 값을 추출합니다. 

그리고 중괄호와 콤마를 가진 코드를 제공했기 때문에 이것을 가지고 배열을 만들어서

공백과 공백 사이에 있는 모스부호 값과 비교하시면 쉽게 해결할 수 있습니다.

다만, 숫자를 통해 알파벳을 구성하는 법도 떠올리면 더 편하게 풀 수 있을 거예요.

| 풀이 1

힌트에서 설명드린 대로 letter를 공백 기준으로 쪼개서 배열로 만들고,

이중 for문으로 모스부호의 값을 가진 배열의 값과 비교합니다.

그리고 소문자 a가 아스키코드로 표현하면 97이라는 것을 활용하여

모스배열의 인덱스에 97을 더하여 char형태로 형변환을 해주면 된답니다.

public class Solution{
	public String solution(String letter) {
        StringBuilder sb = new StringBuilder();
        String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        String[] word = letter.split(" ");   
        for(String alphabet : word) {
        	for(int i = 0 ; i < morse.length ; i++) {
        		if(alphabet.equals(morse[i])) {
        			sb.append((char)(i+97));
        		}
        	}
        }    
        return sb.toString();
	}
}

| 풀이 2

숫자값을 가지고 문자를 도출하는 게 어렵다면

key, value를 가지고 있는 컬렉션 Map을 활용할 수도 있습니다.

import java.util.*;
public class Solution {
    public String solution(String letter) {
        StringBuilder sb = new StringBuilder();
        
        Map<String,String> map = new HashMap<String,String>();
        map.put(".-","a");
        map.put("-...","b");
        map.put("-.-.","c");
        map.put("-..","d");
        map.put(".","e");
        map.put("..-.","f");
        map.put("--.","g");
        map.put("....","h");
        map.put("..","i");
        map.put(".---","j");
        map.put("-.-","k");
        map.put(".-..","l");
        map.put("--","m");
        map.put("-.","n");
        map.put("---","o");
        map.put(".--.","p");
        map.put("--.-","q");
        map.put(".-.","r");
        map.put("...","s");
        map.put("-","t");
        map.put("..-","u");
        map.put("...-","v");
        map.put(".--","w");
        map.put("-..-","x");
        map.put("-.--","y");
        map.put("--..","z");
        
        String[] arr = letter.split(" ");
        for(String s : arr){
            if(map.containsKey(s)){
                sb.append(map.get(s));
            }
        }
        return sb.toString();
    }
}

| 해설

자바에서 컬렉션은 배열을 좀 더 다양한 방면으로 활용하기 위해 탄생한 기술입니다.

그렇기 때문에 대부분 배열로 만들어진 코드는 컬렉션으로도 만들 수 있지요.

개발의 다채로움을 느낄 수 있는 재밌는 문제였습니다.

댓글