(백준) 모스 부호

hwisaac·2024년 11월 1일
0

코테TIL

목록 보기
5/20

문제 링크

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

문제풀이

const filePath = process.platform === 'linux' ? 0 : './input.txt';
const [N, input] = require('fs').readFileSync(filePath).toString().split('\n');

function translate(m){
    const table = {
        '.-': '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',
        '-----': '0',
        '.----': '1',
        '..---': '2',
        '...--': '3',
        '....-': '4',
        '.....': '5',
        '-....': '6',
        '--...': '7',
        '---..': '8',
        '----.': '9',
        '--..--': ',',
        '.-.-.-': '.',
        '..--..': '?',
        '---...': ':',
        '-....-': '-',
        '.--.-.': '@',
    }

    return table[m]
}

function solution(N, input){
    let mosArr = input.split(' ');
    let result = ''
    mosArr.forEach( m => {
        result += translate(m)
    })
    
    return result
}

console.log(solution(N, input))

이 코드는 주어진 모스 부호 메시지를 해독하여 원래 문자열을 출력하는 문제를 해결하기 위해 작성되었습니다.

특징

  1. 간단하고 직관적인 함수 분리: translate 함수와 solution 함수를 분리하여, 모스 부호를 변환하는 기능과 전체 메시지를 해독하는 기능을 명확하게 분리했습니다.
  2. 사전 활용: 모스 부호 테이블을 객체(table)로 작성하여, 변환 시 O(1) 시간 복잡도로 변환이 가능합니다.

개선 사항

  1. 변환 테이블 외부로 분리:

    • 모스 부호 변환 테이블(table)이 translate 함수 내에 선언되어 있어, 함수가 호출될 때마다 테이블을 새로 정의합니다. 이는 불필요한 반복이므로, table 객체를 translate 함수 바깥에 선언하여 함수 호출 시 테이블을 재정의하지 않도록 하는 것이 좋습니다.
  2. forEach 대신 map 사용:

    • mosArr.forEach(m => { result += translate(m); }) 대신 mapjoin을 사용하면 좀 더 간결하게 문자열을 생성할 수 있습니다.
    • result = mosArr.map(translate).join(''); 형태로 수정하면 result를 반복해서 업데이트할 필요가 없어 코드가 간결해집니다.
  3. 입력 변수 검증:

    • N 값이 주어진 모스 부호 메시지의 길이와 일치하는지 검증하는 조건을 추가하여, 예상치 못한 입력을 미리 확인할 수 있습니다.
  4. 전체 코드 개선:

    • 위 제안 사항을 적용한 전체 코드입니다.

개선된 코드

const filePath = process.platform === 'linux' ? 0 : './input.txt';
const [N, input] = require('fs').readFileSync(filePath).toString().split('\n');

// 모스 부호 변환 테이블을 함수 외부로 분리
const table = {
    '.-': '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', '-----': '0', '.----': '1', '..---': '2', '...--': '3',
    '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8',
    '----.': '9', '--..--': ',', '.-.-.-': '.', '..--..': '?', '---...': ':',
    '-....-': '-', '.--.-.': '@'
};

function translate(morseCode) {
    return table[morseCode];
}

function solution(N, input) {
    // 모스 부호 메시지를 해독하여 원래 문자열을 반환
    return input.split(' ').map(translate).join('');
}

console.log(solution(N, input));

코드 설명

  1. 테이블의 함수 외부 분리: table 객체를 함수 외부로 옮겨, translate 함수가 호출될 때마다 객체가 생성되지 않도록 했습니다.
  2. mapjoin 사용: 모스 부호를 각각 해독하여 map을 통해 배열을 생성하고 join을 사용해 문자열로 결합했습니다. 코드가 더 간결해졌고 result 변수를 추가할 필요가 없어졌습니다.

이렇게 수정하면 코드의 성능이 약간은 향상되고, 코드 가독성도 더 좋아집니다.

0개의 댓글