백준 1157 단어 공부

단어 공부

문제

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

입력

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

출력

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

풀이

우선 필요한정보는 주어진 조건의 문자가 몇개인지를 확인

각문자들의 갯수를 카운트해서 어떤 문자가 가장많은지 확인

이 필요하다.

우선 문자열로 주어진 조건을 객체로 만들어서 풀기쉽게 정리해보자

const input = "Mississipi";
const charMap = {};

for (let char of input.toLowerCase()) {
  charMap[char] = charMap[char] ? charMap[char] + 1 : 1;
}

for of 반복문은 요소(값)을 가져오므로 m,i,...등을 가져온다

(for in반복문은 인덱스를 가져옴)

그후 Max Chars Algorithm(가장 많이 쓰인 문자 찾기 알고리즘)
을 이용해 객체의 성질 (객체['키'] = 값) 을 이용해 객체안에

키에 값이 있다면 +1 없다면 1 을 넣는 코드인

charMap[char] = charMap[char] ? charMap[char] + 1 : 1;

을 작성에 넣자.

위의 코드를 결과값으로 보면

charMap : { m: 1, i: 4, s: 4, p: 1 } 이런 값을

얻는다.

그다음으로는 여기 객체안에있는 값들을 비교해 가장 큰수만을 얻는

코드를 작성해야 하는데 이때 Math.max.apple(null,배열)

을 이용하자

코드로 작성해보면

const max = Math.max.apply(null,Object.values(charMap)

을 작성하는데 여기서 Object.values는 매서드의 매개변수로

들어온 객체에 대해서 객체들의 값을 배열로 반환해주는 매서드이다.

위의 코드를 실행하면 max는 4가나온다.

다음으로는 최대개수로 나온 숫자가 맞는지 확인하는 과정을 거쳐야한다.

이때도 반복문을 이용해 객체들의 값을 확인하는 코드를 짜면된다.

코드로 옮겨보면

for ( let char in charMap) {
	if ( charMap[char] === max) {
        maxChar = char;
    count++;
  }
  if (count >= 1) {
    console.log("?");
    return;
  }
}
console.log(maxChar.toLowerCase());

위의 코드를 작성하면 끝난다.

const input = "Mississipi";
const charMap = {};

for (let char of input.toLowerCase()) {
  charMap[char] = charMap[char] ? charMap[char] + 1 : 1;
}
// console.log("charMap : ", charMap["m"]);
const max = Math.max.apply(null, Object.values(charMap));
let maxChar = "";
let count = 0;
for (let char in charMap) {
  if (charMap[char] === max) {
    maxChar = char;
    count++;
  }
  if (count >= 1) {
    console.log("?");
    return;
  }
}
console.log(maxChar.toLowerCase());

위의 코드가정답이다.
정리해보자면



좋은 웹페이지 즐겨찾기