[백준 | Javascript] 1157

박기영·2022년 5월 19일
0

백준

목록 보기
48/127

문자열 5단계
1157번. 단어 공부

문제

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

입력

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

출력

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

예제 입출력

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

solution

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();

// 대소문자를 구분하지 않으므로 input 문자열을 모두 대문자로 변환
const newInput = input.toUpperCase();

// 알파벳 대문자 개수만큼을 원소 개수로 가지는 배열 생성 후 0으로 초기화
const countArr = new Array(26).fill(0);
let str = [];

for(let i = 0; i < input.length; i++){
  // newInput의 i번째 문자열을 아스키 코드 번호로 전환
  // 대문자로 변환해놨으므로 A를 의미하는 65를 빼줘야함
  // 따라서, newInput이 A라면 65 - 65 = 0
  // countArr[0]이 +1 됨
  countArr[newInput.charCodeAt(i) - 65]++;
}

// countArr에서 가장 높은 수를 추출
const max = Math.max(...countArr);
// max의 인덱스 번호를 추출
const index = countArr.indexOf(max);

// max값을 가지는 인덱스가 여러 개일 경우를 판단하기 위한 지표
let sameRate = false;

for(let i = 0; i < 26; i++){
  // 위에서 구한 max와 그의 인덱스가 같지않으면
  // 다른 인덱스에 또 max가 존재하는 것이므로 
  // sameRate를 true로 변경하고 반복문을 break한다
  // 한번이라도 중복되면 ? 출력해야하므로 더 반복할 필요가 없기 때문
  if(countArr[i] === max && index != i){
    sameRate = true;
    break;
  }
}

// 삼항연산자를 사용해서 sameRate가 true이면 ?
// false이면 index + 65를 코드로 변환해서 출력(대문자)
console.log(sameRate ? "?" : String.fromCharCode(index + 65) );

해설

이번 문제는 중간까지는 풀었는데, 여러 개일 경우를 판단하는 법을 구현하지 못해서 다른 분의 풀이를 참고헀다. 참고 사이트
여기에 풀이를 적기보다는 주석을 보면서 흐름을 따라가보자.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글