본문 바로가기
프로그래밍/백준 알고리즘

[백준 / node.js] 1157번: 단어 공부

by 정빈e 2021. 8. 11.
728x90

출처: 백준

 

1157번: 단어 공부

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 1

baaa

예제 출력 1

A

내 코드

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input;

rl.on("line", function (line) {
  input = line;
  rl.close();
}).on("close", function () {
  const count = new Array(26).fill(0);
  const aToZ = [];
  const upperCaseArr = input.toUpperCase().split("");

  for (let i = 65; i <= 90; i++) {
    [];
    aToZ.push(String.fromCharCode(i));
  }

  for (let j = 0; j < upperCaseArr.length; j++) {
    for (let k = 0; k < aToZ.length; k++) {
      if (upperCaseArr[j] === aToZ[k]) {
        count[k] += 1;
      }
    }
  }

  const max = count.reduce((a, b) => Math.max(a, b));
  const index = count.indexOf(max);
  const lastIndex = count.lastIndexOf(max);
  const alphabet = String.fromCharCode(index + 65);

  if (index !== lastIndex) {
    console.log("?");
  } else console.log(alphabet);
  process.exit();
});

결과

> Mississipi
?
> zZa
Z
> z
Z
> baaa
A

 

이번 문제는 좀 어려웠다.

풀이는 일단 카운트를 셀 배열을 알파벳 숫자 26개의 길이로 만들어 0을 채워 넣었다. 

 

count

[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

 

aToZ 배열에는 for문을 이용해서 아스키코드를 변환하여 문자 A~Z까지 담았다

 

aToZ

[  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]

 

upperCaseArr 배열에는 입력 값을 한 자리씩 끊어 담았다.

 

upperCaseArr

[ 'M', 'I', 'S', 'S', 'I', 'S', 'S', 'I', 'P', 'I' ]

 

이렇게 준비를 하고 upperCaseArr와 aToZ를 비교해서 같은 문자가 있으면 count 배열의 해당 인덱스에 1씩 더했다.

 

그럼 count는 이렇게 된다.

count

[ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0 ]

 

그 후에 이 count 배열에서 최댓값을 구한 뒤 인덱스를 구한다.

indexOf와 lastIndexOf() 메서드로 최댓값이 2개 이상일 때 같으면 ?를 출력하고 아니면 

max값을 해당 인덱스에 맞는 알파벳으로 변환하여 출력하였다.

 

 

복잡하게 짠 거 같은데 일단은 성공!

upperCaseArr

 

upperCaseArr

upperCaseArr

728x90

댓글