본문 바로가기
백준/정렬

백준 1302 c++ "베스트셀러" -PlusUltraCode-

by PlusUltraCode 2025. 9. 17.

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

[필자 사고]

일단 입력의 이름의 갯수를 카운트해야 되므로 필자는 map자료 구조를 이용하여 정리했다.

그 후 정렬 조건은 map내용들을 vector로 옮겨서 정렬 조건에 맞게 정렬했다.

 

아래는 자세한 코드 해설이다.

[코드 해설]

cmp 함수

  • 정렬 기준을 정의하는 비교 함수입니다.
  1. if (a.second != b.second) return a.second > b.second;
    • 등장 횟수(value)가 다르면 더 큰 횟수를 먼저 오도록 정렬 (내림차순).
  2. return a.first < b.first;
    • 등장 횟수가 같으면 문자열(key) 사전순으로 정렬 (오름차순).

Input 함수

  • 입력을 처리합니다.
  1. cin >> N; → 문자열의 개수 입력.
  2. for문으로 N번 반복하며 문자열 name 입력.
  3. myMap[name]++; → map<string,int>에서 해당 문자열의 등장 횟수를 1씩 증가.
    • map은 자동으로 문자열을 key로 관리하고, 중복을 허용하지 않으므로 등장 횟수 세기에 적합합니다.

Game_Start 함수

  • 실제 정렬과 결과 출력 과정을 담당합니다.
  1. vector<pair<string,int>> vec(myMap.begin(), myMap.end());
    • map의 데이터를 벡터로 옮깁니다.
    • 벡터로 변환해야 sort() 함수를 이용한 value 기준 정렬이 가능합니다.
  2. sort(vec.begin(), vec.end(), cmp);
    • cmp 기준에 따라 등장 횟수 내림차순, 같을 경우 key 사전순 오름차순 정렬.
  3. cout << vec[0].first;
    • 가장 첫 번째 원소(등장 횟수가 가장 많고, 사전순으로 앞선 문자열)의 key를 출력.

main 함수

  • 전체 실행 흐름을 제어합니다.
  1. Input() → 문자열 개수와 데이터를 입력받음.
  2. Game_Start() → 정렬 후 가장 많이 등장한 문자열 출력.

[소스 코드]

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

int N;
map<string, int> myMap;

bool cmp(pair<string, int> a, pair<string, int> b) {
	if (a.second != b.second)return a.second > b.second;
	return a.first < b.first;
}

void Input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		string name;
		cin >> name;
		myMap[name]++;
	}
}

void Game_Start() {
	vector<pair<string, int>> vec(myMap.begin(), myMap.end());
	sort(vec.begin(), vec.end(), cmp);

	cout << vec[0].first;
}

int main(void) {
	Input();
	Game_Start();
}