# [Algorithm/JS] 백준 1157번 단어 공부

🔗 문제 바로가기 (opens new window)

# Question

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

# Input

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

# Output

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

# Example

# Input 1

Mississipi
1

# Output 1

?
1

# Input 2

zZa
1

# Output 2

Z
1

이 외의 입출력은 상단의 문제 바로가기 링크에서 확인

# 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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  1. 입력값의 각 문자가 몇번 사용되었는지 숫자를 담을 배열이다.

  2. 받아온 입력값을 모두 소문자로 변환하고, 한 문자씩 split 한 배열

  3. 한 글자씩 분리한 배열에서 중복되는 값을 제거한다.

    예) 입력값이 Mississipi 일 때, wordset 은 이와 같다.

    const word = ['m', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'i'];
    const set = ['m', 'i', 's', 'p'];
    
    1
    2
  4. set 배열을 순회하도록 배열 메서드 map 을 사용했고, word 배열에서 에서 set 의 배열과 일치하는 문자의 개수를 1번에서 생성한 cnt 배열에 push 한다.

    예) 위 예제의 상황에서 set 이 가지고 있는 값들의 개수를 cnt 에 push 했을 때, cnt[ 1, 4, 4, 1 ] 이다.

    m 개수 1개, i 개수 4개, s 개수 4개, p 개수 1개

  5. plural 변수는 cnt에서의 최대 값을 구해 가장 많이 사용된 문자의 개수를 구한다.

    위 예제에서 is *두 문자가* 가장 많이 사용된 문자이다. 때문에 plural 변수는 2의 값을 갖는다.

  6. 문제에서 가장 많이 사용된 알파벳이 여러개라면 ? 를 반환한다고 했기에 plural 변수가 1보다 큰 값을 갖는다면 ? 를 출력하고 return 문으로 함수를 빠져나온다.

  7. 가장 많이 사용된 문자 개수의 인덱스를 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));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

다른 풀이를 보면 대부분 아스키코드 메소드를 응용하여 사용했다. 나는 아직 아스키코드를 다루는 데 미숙해서 제대로 활용하지 못했다. 아스키코드 관련 메소드들을 다양하게 활용하고 연습해볼 필요성을 느꼈다.

Last Updated: 2022. 6. 5. 오후 3:42:39