# [Algorithm/JS] 백준 1157번 단어 공부
# Question
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
# Input
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
# Output
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
# Example
# Input 1
Mississipi
# Output 1
?
# Input 2
zZa
# Output 2
Z
이 외의 입출력은 상단의 문제 바로가기 링크에서 확인
# Solution
# 나의 풀이
const input = require('fs').readFileSync('../input.txt').toString().trim();
function solution(input) {
const cnt = []; // 1
const word = input.toLowerCase().split(''); // 2
const set = [...new Set(word)]; // 3
set.map((el) => {
// 4
cnt.push(word.filter((i) => i === el).length);
});
const plural = cnt.filter((a) => a === Math.max(...cnt)).length; // 5
if (plural > 1) return console.log('?'); // 6
const maxStr = set[cnt.indexOf(Math.max(...cnt))]; // 7
console.log(maxStr.toUpperCase()); // 7
}
solution(input);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
입력값의 각 문자가 몇번 사용되었는지 숫자를 담을 배열이다.
받아온 입력값을 모두 소문자로 변환하고, 한 문자씩 split 한 배열
한 글자씩 분리한 배열에서 중복되는 값을 제거한다.
예) 입력값이
Mississipi
일 때,word
와set
은 이와 같다.const word = ['m', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'i']; const set = ['m', 'i', 's', 'p'];
1
2set 배열을 순회하도록 배열 메서드
map
을 사용했고, word 배열에서 에서 set 의 배열과 일치하는 문자의 개수를 1번에서 생성한cnt
배열에push
한다.예) 위 예제의 상황에서 set 이 가지고 있는 값들의 개수를 cnt 에 push 했을 때,
cnt
는[ 1, 4, 4, 1 ]
이다.m 개수 1개, i 개수 4개, s 개수 4개, p 개수 1개
plural
변수는 cnt에서의 최대 값을 구해 가장 많이 사용된 문자의 개수를 구한다.위 예제에서
i
와s
*두 문자가* 가장 많이 사용된 문자이다. 때문에 plural 변수는 2의 값을 갖는다.문제에서 가장 많이 사용된 알파벳이 여러개라면
?
를 반환한다고 했기에plural
변수가 1보다 큰 값을 갖는다면?
를 출력하고 return 문으로 함수를 빠져나온다.가장 많이 사용된 문자 개수의 인덱스를 set 배열의 인덱스로 지정해 가장 많이 사용된 문자가 무엇인지
maxStr
변수에 할당해 대문자로 출력했다.
다른 사람들의 풀이보다 좀 복잡해진것 같고 채점 시간도 더 오래 걸렸다. 하드코딩한 느낌.
다른 사람들의 풀이를 보자.
# 다른 풀이
let input = require('fs').readFileSync('../input.txt').toString().trim().toLowerCase();
let 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));
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
다른 풀이를 보면 대부분 아스키코드 메소드를 응용하여 사용했다. 나는 아직 아스키코드를 다루는 데 미숙해서 제대로 활용하지 못했다. 아스키코드 관련 메소드들을 다양하게 활용하고 연습해볼 필요성을 느꼈다.