문제
풀이
생각보다 엄청 간단하면서 생각보다 까다로울 수 있는 문제다.
문제의 키포인트는 아스키 코드를 활용해서 문자를 숫자로 바꿀 수 있느냐 일 듯 하다.
풀이 방향
조건이 생각보다 많다.
알파벳 대소문자를 구별하지 않으며,
알파벳 개수를 카운트 해야 하고
가장 많이 사용된 알파벳을 출력하는데, 2개 이상이라면 ?를 출력해줘야 한다.
내가 풀이한 방향은 다음과 같다.
1. 단어를 대문자로 바꾸고 A-Z순으로 정렬한다.
2. 단어의 각 알파벳들을 아스키코드를 이용해 A=0, Z=25의 인덱스 취급하여 배열에 카운트한다.
3. 카운트가 가장 클 때의 배열 인덱스와 최댓값을 갱신한다.
4. 배열 내에서 최댓값을 가지는 인덱스를 뒤에서부터 조회하는데
뒤에서부터 조회한 인덱스와 최대값의 인덱스가 일치하지 않으면
가장 많이 사용된 알파벳이 2개 이상 존재한다.
(1번에서 알파벳 순으로 정렬했으므로 최대값의 인덱스에는 가장 작은 인덱스가 들어간다.)
2개 이상 존재하면 ? 출력, 1개라면 해당 인덱스를 아스키코드를 이용해 문자화하여 출력한다.
코드
function sol(str) {
str = str.toUpperCase().split("").sort().join("");
const arr = new Array(26).fill(0);
let max = Number.MIN_SAFE_INTEGER;
let maxIdx = -1;
for (let x of str) {
const idx = x.charCodeAt() - 65;
arr[idx]++;
if (max < arr[idx]) {
max = arr[idx];
maxIdx = idx;
}
}
const lastIdx = arr.lastIndexOf(max);
if (lastIdx !== maxIdx) return "?";
return String.fromCharCode(maxIdx + 65);
}
// 백준에서 입력을 받는 코드
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
console.log(sol(line));
})
.on("close", () => {
process.exit();
});
4번 절차에서 filter 메서드를 사용하여 걸러진 배열 크기가 2이상인지 판단해도 된다.
이렇게 하면 단어 알파벳을 정렬하지 않아도 된다.
코드2
function sol(str) {
str = str.toUpperCase().split("");
const arr = new Array(26).fill(0);
const maxObj = {
idx: -1,
val: Number.MIN_SAFE_INTEGER,
};
str.map((x) => {
const idx = x.charCodeAt() - 65;
arr[idx]++;
if (maxObj.val < arr[idx]) {
maxObj.val = arr[idx];
maxObj.idx = idx;
}
});
const length = arr.filter((size) => size === maxObj.val).length;
return length > 1 ? "?" : String.fromCharCode(maxObj.idx + 65);
}
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
console.log(sol(line));
})
.on("close", () => {
process.exit();
});
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 1152번 단어의 개수 - JavaScript(NodeJS) (0) | 2021.07.01 |
---|---|
[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS) (0) | 2021.06.09 |
[백준] 9663번 N-Queen - JavaScript(NodeJS) (1) | 2021.06.08 |
[백준] 16198번 에너지 모으기 - JavaScript(NodeJS) (0) | 2021.06.08 |
[백준] 16197번 두 동전 - JavaScript(NodeJS) (0) | 2021.06.07 |