🔗 1157번 : 단어공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
const fs = require('fs')
//let input = fs.readFileSync('/dev/stdin').toString().trim();
let input = "Mississipi"
let charCount = {};
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
for(let char of input.toUpperCase()) {
charCount[char] = charCount[char] ? charCount[char] + 1 : 1 ;
}
let max = Math.max(...Object.values(charCount))
let maxLength = Object.values(charCount).filter( (v,i) => {
return Object.values(charCount)[i] === max
}).length
console.log(maxLength > 1 ? "?" : getKeyByValue(charCount,max))
풀이에 사용한 방법은
알파벳 : 등장횟수
로 charCount
변수에 담는다. 문제의 조건이 대문자로 반환하는 것이므로 사전에 toUpperCase()
를 이용하여 대문자로 담는다.max
변수에 담는다.?
를 출력해야 하므로 filter
메소드를 이용하여 배열에 담고 배열의 길이를 구해 maxLength 변수에 담는다.maxLength
변수의 길이가 1
보다 클 경우 ?
를, 아니면 객체 값을 키를 찾는 함수를 이용하여 해당 알파벳을 반환한다.let input = require('fs').readFileSync('/dev/stdin').toString().toLowerCase();
const result = new Array(26).fill(0); // a-z를 위한 배열을 만들어주고 0의 값으로 채움
for (let i = 0; i < input.length; i++) {
result[input.charCodeAt(i) - 97] ++;
}
const max = Math.max(...result); /// 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)); // 다시 알파벳으로 나타내주기 위함
알파벳의 아스키코드를 사용해서 풀었다.
charCodeAt()
: 메서드는 주어진 인덱스에 대한 UTF-16 코드를 나타내는 0부터 65535 사이의 정수를 반환합니다.
fromCharCode()
: 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다.
a-z
의 아스키코드는 97-122번 A-Z
의 아스키코드는 65-90번이다.