whatisthis?

[백준] 1157번 - 단어 공부 (node.js) 본문

ALGORITHM/BOJ (Node.js)

[백준] 1157번 - 단어 공부 (node.js)

thisisyjin 2022. 7. 7. 15:46

JavaScript

  • 문자열

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제

입력

Mississipi

출력

?

입력

zZa

출력

Z

내 코드

const input = require('fs').readFileSync('/dev/stdin').toString();

const word = input.toUpperCase(); 
// A-Z (65-90)
let count = Array(26).fill(0);

for (let i of word) {
    const char = i.charCodeAt();
    count[char - 65] += 1;
}

const max = Math.max(...count); 
const maxCount = count.filter(x => x === max).length;

const index = count.indexOf(max);
const result = String.fromCharCode(index + 65);

console.log(maxCount === 1 ? result : '?');

소문자 카운트와 대문자 카운트를 합치므로, 처음에 input.toUpperCase()를 해서 대문자로 변환해준다.
그 다음, count라는 배열을 만들고 A-Z까지 카운트를 센다.

우선 word를 for..of로 반복문을 실행하는데, char(=i.charCodeAt()) 의 - 65만큼 한 인덱스에 +1 을 해준다.
-> 'A' 의 아스키코드가 65이기 때문에 65-65=0 번지 인덱스에 카운트가 되어야 하므로.

max는 count 중에서 가장 큰 수이고, (=가장 많이 들어있는 알파벳)
maxCount는 max가 몇개 있는지를 filter메서드로 카운트 한 것이다.

max의 인덱스를 구하고, String.fromCharCode()를 하여 인덱스+65 만큼의 숫자를 아스키코드로 하여
문자열로 변환한다.

삼항 연산자를 이용하여 만약 max 값이 여러개라면 '?'를 반환하고, 1개라면 result를 반환한다.

실행 결과

152ms / 16528KB