출처
백준 온라인 저지
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
풀이
처음에는 for 문을 여러 개 사용하여 풀이를 하니 시간 초과가 나와버렸습니다. 그래서 최대한 for 문을 줄이는 방향으로 다시 풀이해보았습니다.
charCodeAt 메서드는 해당 인덱스에 대한 유니코드를 반환합니다.
"a".charCodeAt(0) === 97
이 것을 이용하여 a-z까지의 배열을 만들어 0을 채워줍니다.
각 반환된 코드에서 최솟값(a = 97)을 빼주어 배열 인덱스로 사용해주고 해당 영단어 위치의 값을 1씩 증가시켜줍니다.
그 후 처음에는 for 문을 사용했던 max값을 Math.max 메서드로 구할 수 있는 구조가 되었고 indexOf 메서드로 max값이 위치한 배열의 index값을 구해줍니다.
다시 한번 a-z의 수만큼을 for 문을 돌려 해당 인덱스 값과 max값 그리고 중복을 막기 위한 index 값 비교를 통한 중복 값이 있는지 확인해주고 중복되는 값이 있을 시 출력을 "?"로 해주기 위해 isSame을 true로 바꿔줍니다.
출력 문에서 만약 중복되는 값이 있었다면 "?"을 출력해주고 아닐 시 String.fromCharCode 메서드를 사용하여 해당 index 값에서 65를 더한 값을 (65 부터 "A") 문자열로 생성해 반환합니다.
코드
let input = require('fs').readFileSync('/dev/stdin').toString().toLowerCase();
const result = new Array(26).fill(0);
for (let i = 0; i < input.length; i++) {
result[input.charCodeAt(i) - 97] ++;
}
const max = Math.max(...result);
const index = result.indexOf(max);
let isSame = false;
for (let j = 0; j < 26; j++) {
if (result[j] === max && index != j) {
isSame = true;
break;
}
}
console.log(isSame ? "?" : String.fromCharCode(index + 65));
참고자료