본문 바로가기
알고리즘 (C++)

[백준]11652번: 카드

by Dev_Hugh 2023. 11. 24.
728x90
반응형

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

 

11652번: 카드

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

www.acmicpc.net

 

문제를 보면 가장 중복이 많은 수를 뽑는게 핵심이다.

접근 아이디어는 다음과 같다.

1. 우선 카드 배열에 정수를 다 입력 받는다.

2. 오름차순으로 정렬한다.

3. 현재 중복된 카드 횟수를 저장할 변수 (dupliCnt)와 지금까지 가장 많이 중복된 카드 횟수를 저장할 변수 (maxDupliCnt)를 선언한다.

4. for문을 돌면서 카드가 중복되면 dupliCnt를 증가시키고 이 값이 maxDupliCnt보다 크면 값들을 교체한다. 이 때 핵심은 중복되지 않은 경우엔 dupliCnt를 0으로 초기화 해야 해당 정수값 부터 다시 중복 횟수를 체크한다.   

#include<iostream>
#include<vector>
#include<algorithm>

#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);

using namespace std;

int main(void)
{
	FastIO;

	int N = 0; // 숫자 카드 N장
	cin >> N;

	vector<long long> card(N, 0);
	for (int i = 0; i < N; i++)
	{
		cin >> card[i];
	}
	sort(card.begin(), card.end());

	long long answer = card[0];
	int dupliCnt = 0, maxDupilCnt = 0;
	for (int i = 1; i < N; i++)
	{
		if (card[i] == card[i - 1])
		{
			dupliCnt++; // 중복 횟수 증가
			if (maxDupilCnt < dupliCnt) // 가장 많은 중복 횟수보다 크다면
			{
				maxDupilCnt = dupliCnt; // 가장 많은 중복 횟수를 바꾸고
				answer = card[i]; // 해당 값을 answer로 교체
			}
		}
		else
		{
			dupliCnt = 0; // 중복이 안됐다면 0으로 초기화해서 카운팅 다시 시작
		}
	}

	cout << answer;
	return 0;
}
728x90
반응형

'알고리즘 (C++)' 카테고리의 다른 글

[백준]2018: 수들의 합 5  (0) 2023.12.05
[백준]11501번: 주식  (0) 2023.11.27
[백준]15900번: 나무 탈출  (1) 2023.11.23
[백준]16948번: 데스 나이트  (0) 2023.11.23
[백준] 10867번: 중복 빼고 정렬하기  (0) 2023.11.21