치춘짱베리굿나이스

[백준] 11652 본문

Javascript + Typescript/자바스크립트로 알고리즘풀기

[백준] 11652

치춘 2022. 5. 15. 20:44

카드

문제

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -2^62보다 크거나 같고, 2^62보다 작거나 같다.

준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

입력

첫째 줄에 준규가 가지고 있는 숫자 카드의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

출력

첫째 줄에 준규가 가장 많이 가지고 있는 정수를 출력한다.

풀이

const card = () => {
  let [n, ...arr] = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split("\n");
  let obj = {};
  let sortArr = [];
  for (let v of arr) {
    if (obj[v]) obj[v]++;
    else obj[v] = 1;
  }
  for (let v in obj) sortArr.push([v, obj[v]]);
  sortArr = sortArr
    .sort((a, b) => b[1] - a[1])
    .filter((v) => v[1] === sortArr[0][1])
    .map((v) => BigInt(v[0]))
    .sort((a, b) => {
      if (a > b) return 1;
      else if (a < b) return -1;
      else return 0;
    });
  console.log(String(sortArr[0]));
};

card();

반성회

  1. 해시테이블 비슷하게 자바스크립트 객체를 사용 ⇒ 어차피 key값은 string이므로 굳이 형변환 없이 바로 넣는다 (입력값이 최대 10만개 들어오므로 하나하나 BigInt로 변환하면 불필요하게 소요시간이 늘어날 수 있음)
  2. 배열에서 각 정수가 등장할 때마다 이를 key값으로 사용하고 value로 등장횟수를 세어주기
  3. 다 센 다음 배열로 변환
  4. 배열의 value의 두 번째 요소를 기준으로 (객체에서 value에 해당) 내림차순으로 정렬
  5. 정렬한 배열의 첫 번째 value값과 동일한 value를 가진 원소들을 필터링한다
  6. 필터링된 원소들의 첫 번째 요소 (객체에서 key에 해당) 를 bigInt로 형변환한다
  7. bigInt끼리 정렬한다 이때 bigint - bigintbigint이므로 sort 함수에서 인식할 수 없어 부득이하게 if/else를 사용한다
  8. 필터링 및 정렬된 배열의 맨 첫 번째에 오는 수를 문자열로 형변환하여 출력한다 (형변환을 안 하면 BigInt라 맨 끝에 n이 출력됨)

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 1015  (0) 2022.05.15
[백준] 11399  (0) 2022.05.15
[백준] 1431  (0) 2022.05.10
[백준] 14889  (0) 2022.05.10
[백준] 14652  (0) 2022.05.10
Comments