Link
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오.
단, 대문자와 소문자를 구분하지 않는다.
입력 > 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력 > 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
| 예제 입력
Mississipi
| 예제 출력
?
제출
1)
const input = (
process.platform === "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `Mississipi`
).trim();
const convertedStr = input.toUpperCase().split("").sort();
let count = 0;
let max = 0;
let maxStr = "";
for (let i = 0; i < convertedStr.length; i++) {
if (i > 0 && convertedStr[i] !== convertedStr[i - 1]) {
count = 0;
count++;
} else {
count++;
if (max < count) {
max = count;
maxStr = convertedStr[i];
} else if (max === count) {
maxStr = "?";
} else {
maxStr = maxStr;
}
}
}
console.log(maxStr);
2) 리팩토링
const input = (
process.platform === "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `Mississipi`
).trim();
const usageStatus = {};
input
.toUpperCase()
.split("")
.forEach((key) => {
usageStatus[key] = (usageStatus[key] || 0) + 1;
});
const sortedValue = Object.values(usageStatus).sort((a, b) => b - a);
const maxValue = sortedValue[0];
const maxKey =
sortedValue[0] === sortedValue[1]
? "?"
: Object.keys(usageStatus).find((key) => usageStatus[key] === maxValue);
console.log(maxKey);
풀이과정
첫 번째 제출 코드
대문자와 소문자의 구분 없이 가장 많이 사용된 알파벳을 대문자로 출력해야한다.
- 입력 받은 문자열을 대문자로 변환한다.
- 정렬 메소드인 sort를 사용하기 위해서 split을 사용하고, 정렬된 값을 convertedStr 배열로 만든다.
- 앞 요소와는 다른 문자열이 나올 경우, count를 초기화한 뒤 더해주고,
- 앞 요소와 같은 문자열이 반복될 경우, 최대 count 수와 비교하여 제일 많이 나온 문자열을 출력한다.
두 번째 제출 코드
- usageStatus object에 중복되는 요소의 개수를 저장한다.
- usageStatus의 value 값에는 해당되는 알파벳이 사용된 개수가 저장되어있다.
- 따라서, value값을 내림차순으로 정렬하여 첫 번째 요소를 maxValue로 지정한다.
- 첫 번째 요소와 두 번째 요소가 같다면, 가장 많이 사용된 알파벳이 여러개 존재하는 것이므로 ?를,
- 그렇지 않다면 find 메서드로 value 값을 이용해 가장 많이 나온 숫자의 key 값을 출력한다.
개념
Object.keys()
- 객체의 모든 키 값을 일반적인 반복문의 순서를 가진 배열로 반환한다.
Object.values()
- 객체의 모든 속성 값을 for in 구문과 동일한 순서를 가진 배열로 반환한다.
- for in 구문은 순서를 보장하지 않는다.
Array.prototype.find()
- 주어진 콜백 함수에 만족하는 첫 번째 요소의 값을 반환하고 해당되는 값이 없을 시에는 undefinded를 반환한다.
Comment
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 2908: 상수 (javascript) (0) | 2022.07.05 |
---|---|
[백준] 1152: 단어의 개수 (javascript) (0) | 2022.07.05 |
[백준] 2675: 문자열 반복 (javascript) (0) | 2022.07.04 |
[백준] 10809: 알파벳 찾기 (javascript) (0) | 2022.06.28 |
[백준] 11720: 숫자의 합 (javascript) (0) | 2022.06.28 |