티스토리 뷰

반응형
 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

// 1.
const fs = require('fs');
const [ , ...numbers ] = fs.readFileSync('/dev/stdin').toString().trim().split('\n').map(num => BigInt(num));
const map = new Map();

// 2.
const result = numbers.reduce((max, curr) => {
  // 3.
  const now_cards = (map.get(curr) || 0) + 1;
  const max_cards = (map.get(max) || 0);
  map.set(curr, now_cards);

  // 4.
  if(now_cards > max_cards) {
    max = curr;
  } else if(now_cards === max_cards) {
    curr < max ? 
      max = curr : max;
  }
  return max;
}, 0n);

// 5.
console.log(result.toString());
  1. 필요한 값들을 numbers 배열에 초기화하고, 정답에 사용할 map을 하나 생성해둔다.
    이 때, JS의 최대 값은 2^53 - 1이므로, 문제의 2^62의 크기에 대응하기 위해 map 메소드를 통해 BigInt로 매핑한다.
  2. 모든 입력 값을 순회해야 하므로, reduce 메소드를 reduce((max, curr) => { //... }, 0n); 형태로 사용하였다.
    (숫자에 n이 붙는 리터럴은 BigInt를 나타낸다.)
    각 순회에서 가장 많이 가지고 있는 카드의 번호는 max 변수로서 사용된다.
  3. curr는 매 반복문에서 확인하는 카드 번호이다. 현재 확인 중인 카드의 번호를 map에서 확인하고, 없는 경우 0으로 초기화한다.
    now_cards는 현재 확인 중인 카드이므로 +1을 하여 개수를 카운팅하고, max_cards는 현재 가장 많이 갖고 있는 카드의 개수이다.
  4. 현재 확인 중인 카드의 개수와, 가장 많이 갖고 있는 카드의 개수를 확인하여 최대값인 max를 초기화한다.
    만약 카드의 장수가 같다면, 카드의 번호를 비교하여 더 작은 카드 번호로 max를 바꾸어준다.
  5. console.log(result);의 형태로 출력하면 BigInt의 리터럴인 n이 붙은 형태가 된다.
    또한, console.log(Number(result)); 형태로 출력할 경우 수치의 유실이 발생하게 된다.
    따라서 toString() 메소드를 통해 출력한다.

결과

38520 KB / 304 ms

메모

  • 백준의 알고리즘 분류 상 정렬에 해당하는 문제이나, 정렬을 사용하지 않고 풀었다. 당연히 위의 답은 이상적인 풀이가 아닐 것임!
  • JS의 최대값을 기억해두어야 겠다! 강타입 언어라면 long long 등을 사용하면 되지만, JS에서는 BigInt 타입을 사용한다고 함.
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함