본문 바로가기
백준/실버

[node.js,백준]11652 - 카드

by goodchuck 2024. 5. 9.

목차

     

     

     문제

    링크

    https://www.acmicpc.net/problem/11652

     

    문제

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

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

    입력

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

     

    출력

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

     

    주저리

     

    24/03/28에 해결했던 문제.

     

    로직은 이미 풀었었으나 node기준 2^62승은 Number를 벗어날수있다는걸 보지않았어서 틀렸다고 떴던 문제

    node에서는 Number를 벗어나므로 BigInt를 해주어야하고 그 정렬은 string으로 localeCompare로 정렬해야한다.

    그다음 정렬이 완료된 배열을 이용해 while문을 돌려 이전숫자랑 같은 숫자일경우 ans를 증가시켜 최대 를 넘길경우 해당 숫자로 바꾸고 같을경우엔 더 작은 숫자를 살려 반복해주면 되는 문제이다.

     

    풀이

     1. 입력 파싱

    • 입력된 문자열을 줄 바꿈으로 구분하여 배열에 저장합니다.
    • 첫 번째 줄에서 카드의 개수 `N`을 추출합니다.

     2. 카드 번호 정렬

    • 카드 번호들을 수치 기준으로 정렬하여 비교를 용이하게 합니다.

     3. 빈도 수 계산 및 최빈 카드 찾기

    • - 정렬된 카드 배열을 순회하면서, 각 카드 번호가 이전 번호와 같은지 비교합니다.
    • 같은 경우, 현재 카드 번호의 빈도 수(`currentCount`)를 증가시킵니다.
    • 다른 경우, `currentCount`와 최대 빈도 수(`maxCount`)를 비교하여, 필요한 경우 최빈 카드 번호를 갱신하고, `currentCount`를 재설정합니다.

     4. 마지막 카드 번호 체크

    • - 배열을 모두 순회한 후, 마지막 카드 번호의 빈도 수 체크가 필요합니다.
    • - 마지마닉 빈도 수가 최대 빈도 수보다 클 경우, 최빈 카드 번호를 갱신합니다.

     결과 출력

    • 계산된 가장 빈번한 카드 번호를 출력합니다.

     

     코드

    // 카드
    var fs = require('fs');
    // var input = fs.readFileSync('/dev/stdin').toString();
    let input = `6
    123
    321
    123
    321
    5
    5`
    
    let real = input.trim().split("\n");
    let [first, ...rest] = real;
    let [N, M] = first.split(" ").map(Number);
    
    async function solution() {
        let arr = rest.map(r => BigInt(r)).sort((a, b) => {
            return a.toString().localeCompare(b.toString());
        })
        let index = 0;
        let maxes = -Infinity;
        let ans = 1;
        let answer;
        while (index < N) {
            let targetNum = arr[index];
            if (index === 0) {
                maxes = 1;
                answer = targetNum
            } else {
                let prev = arr[index - 1];
                if (targetNum === prev) {
                    ans += 1;
                } else {
                    ans = 1;
                }
    
                if (maxes < ans) {
                    maxes = ans;
                    answer = targetNum
                }
                else if (maxes === ans) {
                    if (targetNum < answer) {
                        answer = targetNum
                    }
                }
            }
            index++;
        }
        console.log(answer.toString());
    }
    
    solution();

    '백준 > 실버' 카테고리의 다른 글

    [node.js,백준]2156 - 포도주 시식  (0) 2024.05.09
    [node.js,백준]9465 - 스티커  (0) 2024.05.09
    [node.js,백준]11057 - 오르막수  (0) 2024.05.09
    [node.js,백준]2343 - 기타 레슨  (0) 2024.05.09
    [Node.js,백준]10825 - 국영수  (0) 2024.05.08