BOJ/Bronze

[BOJ/백준] 1919번 - 애너그램 만들기 (Javascript / NodeJS)

Paul Eich 2023. 12. 12. 19:37

문제

문제 보러 가기

풀이

쉽게 바로 아즈키코드로 변환 가능한 C 계열 언어들과 달리 Javascript에서는 charCodeAt 메소드를 사용하여 아즈키코드를 구할 수 있다.
'a'의 아즈키코드를 뺀 값을 인덱스로 사용하면 배열의 0~25번 인덱스를 a~z를 카운팅하는데 사용할 수 있다.

"use strict"

const [ word1, word2 ] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

function solution(word1, word2) {
    const arr1 = Array.from({length: 26}, ()=>0)
    const arr2 = Array.from({length: 26}, ()=>0)

    for(let str of word1) {
        arr1[str.charCodeAt()-97]++;
    }

    for(let str of word2) {
        arr2[str.charCodeAt()-97]++;
    }

    let cnt = 0;
    for (let i=0; i<26; i++) {
        if (arr1[i]>0 && arr2[i]>0) cnt+=Math.min(arr1[i], arr2[i]);
    }

    return word1.length + word2.length - 2 * cnt;
}

console.log(solution(word1, word2));

통과 후 다른 사람들의 풀이를 찾아보면서 개선할 수 있는 부분들을 찾아보았다.

  • 아즈키 코드를 굳이 숫자로 직접 표현하는 것보다 'a'.charCodeAt()을 사용하여 a의 아즈키 코드 표현하면 더 정확하게 계산할 수 있다.
  • 반복되는 로직을 함수로 분리하여 재사용할 수 있도록 분리한다.
  • 기존에는 전체 길이에서 공통 길이를 2곱해서 빼주는 방식으로 빼야할 글자 수를 구했지만, 차의 절대값의 합으로 빼야할 글자수를 바로 구하도록 변경한다.

수정한 코드는 다음과 같다.

"use strict"

const [ word1, word2 ] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

function solution(word1, word2) {
    const countAlphabets = (word) => {
        const arr = Array.from({length: 26}, ()=>0);
        for(let str of word) {
            arr[str.charCodeAt()-'a'.charCodeAt()]++;
        }
        return arr;
    }

    const arr1 = countAlphabets(word1);
    const arr2 = countAlphabets(word2);

    let answer = 0;
    for (let i=0; i<26; i++) {
        answer += Math.abs(arr1[i]-arr2[i]);
    }

    return answer;
}

console.log(solution(word1, word2));