문자열 5단계
1157번. 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
Mississipi
?
zZa
Z
z
Z
baaa
A
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();
// 대소문자를 구분하지 않으므로 input 문자열을 모두 대문자로 변환
const newInput = input.toUpperCase();
// 알파벳 대문자 개수만큼을 원소 개수로 가지는 배열 생성 후 0으로 초기화
const countArr = new Array(26).fill(0);
let str = [];
for(let i = 0; i < input.length; i++){
// newInput의 i번째 문자열을 아스키 코드 번호로 전환
// 대문자로 변환해놨으므로 A를 의미하는 65를 빼줘야함
// 따라서, newInput이 A라면 65 - 65 = 0
// countArr[0]이 +1 됨
countArr[newInput.charCodeAt(i) - 65]++;
}
// countArr에서 가장 높은 수를 추출
const max = Math.max(...countArr);
// max의 인덱스 번호를 추출
const index = countArr.indexOf(max);
// max값을 가지는 인덱스가 여러 개일 경우를 판단하기 위한 지표
let sameRate = false;
for(let i = 0; i < 26; i++){
// 위에서 구한 max와 그의 인덱스가 같지않으면
// 다른 인덱스에 또 max가 존재하는 것이므로
// sameRate를 true로 변경하고 반복문을 break한다
// 한번이라도 중복되면 ? 출력해야하므로 더 반복할 필요가 없기 때문
if(countArr[i] === max && index != i){
sameRate = true;
break;
}
}
// 삼항연산자를 사용해서 sameRate가 true이면 ?
// false이면 index + 65를 코드로 변환해서 출력(대문자)
console.log(sameRate ? "?" : String.fromCharCode(index + 65) );
이번 문제는 중간까지는 풀었는데, 여러 개일 경우를 판단하는 법을 구현하지 못해서 다른 분의 풀이를 참고헀다. 참고 사이트
여기에 풀이를 적기보다는 주석을 보면서 흐름을 따라가보자.