
문제
풀이
쉽게 바로 아즈키코드로 변환 가능한 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));'BOJ > Bronze' 카테고리의 다른 글
| [BOJ/백준] 1259번 - 팰린드롬수 (Javascript / NodeJS) (0) | 2023.12.15 |
|---|---|
| [BOJ/백준] 2577번 - 숫자의 개수 (Javascript / NodeJS) (0) | 2023.12.12 |