✏️기록하는 즐거움
article thumbnail

Link

 

1157번: 단어 공부

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

www.acmicpc.net

문제

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

입력 > 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력 > 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

 

| 예제 입력

Mississipi

| 예제 출력

?

 

제출

1) 

const input = (
  process.platform === "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `Mississipi`
).trim();

const convertedStr = input.toUpperCase().split("").sort();

let count = 0;
let max = 0;
let maxStr = "";

for (let i = 0; i < convertedStr.length; i++) {
  if (i > 0 && convertedStr[i] !== convertedStr[i - 1]) {
    count = 0;
    count++;
  } else {
    count++;
    if (max < count) {
      max = count;
      maxStr = convertedStr[i];
    } else if (max === count) {
      maxStr = "?";
    } else {
      maxStr = maxStr;
    }
  }
}

console.log(maxStr);

 

2) 리팩토링

const input = (
  process.platform === "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `Mississipi`
).trim();

const usageStatus = {};

input
  .toUpperCase()
  .split("")
  .forEach((key) => {
    usageStatus[key] = (usageStatus[key] || 0) + 1;
  });

const sortedValue = Object.values(usageStatus).sort((a, b) => b - a);
const maxValue = sortedValue[0];
const maxKey =
  sortedValue[0] === sortedValue[1]
    ? "?"
    : Object.keys(usageStatus).find((key) => usageStatus[key] === maxValue);

console.log(maxKey);

 

풀이과정

첫 번째 제출 코드

대문자와 소문자의 구분 없이 가장 많이 사용된 알파벳을 대문자로 출력해야한다.

  • 입력 받은 문자열을 대문자로 변환한다.
  • 정렬 메소드인 sort를 사용하기 위해서 split을 사용하고, 정렬된 값을 convertedStr 배열로 만든다.
  • 앞 요소와는 다른 문자열이 나올 경우, count를 초기화한 뒤 더해주고,
  • 앞 요소와 같은 문자열이 반복될 경우, 최대 count 수와 비교하여 제일 많이 나온 문자열을 출력한다.

두 번째 제출 코드

  • usageStatus object에 중복되는 요소의 개수를 저장한다.
  • usageStatus의 value 값에는 해당되는 알파벳이 사용된 개수가 저장되어있다.
  • 따라서, value값을 내림차순으로 정렬하여 첫 번째 요소를 maxValue로 지정한다.
  • 첫 번째 요소와 두 번째 요소가 같다면, 가장 많이 사용된 알파벳이 여러개 존재하는 것이므로 ?를,
  • 그렇지 않다면 find 메서드로 value 값을 이용해 가장 많이 나온 숫자의 key 값을 출력한다.

 

 

개념

Object.keys()

  • 객체의 모든 키 값을 일반적인 반복문의 순서를 가진 배열로 반환한다.

Object.values()

  • 객체의 모든 속성 값을 for in 구문과 동일한 순서를 가진 배열로 반환한다.
  • for in 구문은 순서를 보장하지 않는다.

Array.prototype.find()

  • 주어진 콜백 함수에 만족하는 첫 번째 요소의 값을 반환하고 해당되는 값이 없을 시에는 undefinded를 반환한다.

 

더보기

Comment

 

profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!