[백준] 11652번 카드


Sorting

문제설명

문제

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

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

입력

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

출력

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

접근

입력값으로 받은 숫자배열을 Sorting한 다음 맨 앞 부터 가장 여러번 반복되는 정수를 찾으면 된다.

주의할 점은 배열의 끝까지 모두 확인한 뒤 for문이 끝나면 마지막으로 한번 더 cnt가 max_count보다 큰 지 확인한다. 마지막 current_num일 때는 cnt > max_count 조건문을 확인하지 못하고 반복문이 끝나기 때문에 꼭 한번 더 확인을 해준다.

e.g. 7 (1 1 2 2 3 3 3) 일 때, 한 번 더 확인하지 않으면 1이 나온다.(정답: 3)

코드

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);
    
    int n;
    cin >> n;
    long long* arr = new long long[n];
    for(int i=0; i<n; i++)
        cin >> arr[i];
    sort(arr, arr+n);
    
    int cnt=1, max_count=0;
    long long max_num, current_num = arr[0];
    for(int i=1; i<n; i++){
        if(arr[i] == current_num)
            cnt++;
        else{
            if(cnt > max_count){
                max_count = cnt;
                max_num = current_num;
            }
            cnt = 1;
            current_num = arr[i];
        }
    }

    // 한번더 check
	// e.g. 7 (1 1 2 2 3 3 3) 일 때
    if(cnt > max_count){
        max_count = cnt;
        max_num = current_num;
    }
    
    cout << max_num << '\n';
}

참고

BOJ #11652

이 글이 도움이 되셨다면 추천 클릭을 부탁드립니다 :)




© 2021. by Gyeong-Hyeon Kim

Powered by ddamddi