문제
소문자 알파벳으로만 이루어진 문자열을 입력받아 각 문자의 점수를 합산하는 JavaScript 함수를 작성해야 합니다. 여기서 알파벳의 인덱스는 1부터 시작하며, 'a'는 1, 'b'는 2, 'c'는 3처럼 순서대로 매겨지고 마지막 'z'는 26이 됩니다.
즉, 함수는 문자열에 포함된 모든 문자의 인덱스 값을 모두 더한 총합을 반환해야 합니다.
예제
다음은 해당 코드입니다 −
const str = 'lowercasestring';
const findScore = (str = '') => {
const alpha = 'abcdefghijklmnopqrstuvwxyz';
let score = 0;
for(let i = 0; i < str.length; i++){
const el = str[i];
const index = alpha.indexOf(el);
score += (index + 1);
};
return score;
};
console.log(findScore(str));
출력
다음은 콘솔 출력 결과입니다 −
188
코드 동작 원리
이 코드는 먼저 알파벳 전체를 담은 기준 문자열 alpha를 준비합니다. 그다음 for 루프를 통해 입력 문자열의 각 문자를 하나씩 확인하고, indexOf() 메서드로 해당 문자가 알파벳에서 몇 번째 위치에 있는지 찾습니다.
indexOf()는 0부터 인덱스를 세기 때문에 여기에 1을 더해 1부터 시작하는 점수로 변환한 뒤 score 변수에 누적합니다. 모든 문자를 처리하면 누적된 총점을 반환합니다.
더 효율적인 대안: charCodeAt() 활용
참고로 charCodeAt() 메서드를 사용하면 기준 문자열 없이도 같은 결과를 얻을 수 있습니다. 소문자 'a'의 유니코드 값은 97이므로, 각 문자의 charCodeAt() 값에서 96을 빼면 곧바로 1부터 시작하는 점수가 계산됩니다.
const findScore = (str = '') => {
let score = 0;
for(const ch of str){
score += ch.charCodeAt(0) - 96;
}
return score;
};이 방식은 indexOf()로 매번 문자열을 검색하지 않으므로 성능 면에서도 더 유리합니다.