[boj] 11652. 카드 (node.js)

호이·2022년 1월 26일
0

algorithm

목록 보기
1/77
post-thumbnail

요약

11652

  • 주어진 숫자 카드 중에서 가장 개수가 많은 카드를 출력하라.
  • 최대 개수가 동일한 카드가 여러 개라면 카드 번호가 더 작은 카드를 출력.

풀이

내 풀이

const readline = require("readline");

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

let input = [];

rl.on("line", function (line) {
  input.push(line);
}).on("close", function () {
  const [N, ...cards] = input.map(BigInt);

  cards.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));

  let count = 1,
    maxCnt = 0,
    maxVal = BigInt(cards[0]),
    nextCard = undefined;

  cards.forEach((card, index) => {
    nextCard = cards[index + 1];
    if (card == nextCard) {
      count++;
    } else {
      count = 1;
    }
    if (count > maxCnt) {
      maxCnt = count;
      maxVal = card;
    }
  });

  console.log(maxVal.toString());
  process.exit();
});
  1. BigInt
    • 문제에서 주어진 숫자 카드에 적힌 숫자가 +- 2^62 를 넘어서는 수준이므로 반드시 BigInt 자료형을 사용해야 한다.
    • BigInt를 사용했으므로 결과값 출력시에는 string형태로 변환해서 출력해야 한다.
  2. BigInt의 sort
    • Array.prototype.sort() 자바스크립트의 내장 sort는 유니코드 기반 문자열 정렬이므로 숫자 정렬시에는 비교 함수를 인자로 전달해야 한다.
    • 여기서 중요! BigInt 자료형의 sort를 정의할 때 return (a-b)의 경우는 반환값이 정수가 되어 오류가 난다. BigInt로 반환하기 위해서는 아래처럼 부등호를 통해 bool 연산값을 알고 -1, 0, 1 중 하나를 반환시켜야 한다.
    • cards.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
      링크 StackOverflow

주절주절

  • 풀다 보니 오기가 생겨서 오전 내내 붙들고 ... 거의 20번 제출한 것 같다...!! 문제 풀이 과정에서 코드에 오류가 있는 것 같아서 계속 들여다봤고, 그래서 여러 번 고쳐보며 분명 배운 건 많은 느낌이다. for문으로도 해봤고, forEach로도 해보고, sort도 이것저것 만져보고, count도 여러 번 봤다.
  • 그런데 틀린 이유가 readline 이었다니, 왜 진작에 시도해보지 않았을까 싶다. 꼭 겪어 봐야지 진심으로 깨닫더라. 다음에는 절대 같은 실수 하지 않기!!!

열심히...삽질했다...삽질...
그래도 풀어서 뿌듯!

profile
매일 부활하는 개복치

0개의 댓글