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

[필자 사고]
일단 입력의 이름의 갯수를 카운트해야 되므로 필자는 map자료 구조를 이용하여 정리했다.
그 후 정렬 조건은 map내용들을 vector로 옮겨서 정렬 조건에 맞게 정렬했다.
아래는 자세한 코드 해설이다.
[코드 해설]
cmp 함수
- 정렬 기준을 정의하는 비교 함수입니다.
- if (a.second != b.second) return a.second > b.second;
- 등장 횟수(value)가 다르면 더 큰 횟수를 먼저 오도록 정렬 (내림차순).
- return a.first < b.first;
- 등장 횟수가 같으면 문자열(key) 사전순으로 정렬 (오름차순).
Input 함수
- 입력을 처리합니다.
- cin >> N; → 문자열의 개수 입력.
- for문으로 N번 반복하며 문자열 name 입력.
- myMap[name]++; → map<string,int>에서 해당 문자열의 등장 횟수를 1씩 증가.
- map은 자동으로 문자열을 key로 관리하고, 중복을 허용하지 않으므로 등장 횟수 세기에 적합합니다.
Game_Start 함수
- 실제 정렬과 결과 출력 과정을 담당합니다.
- vector<pair<string,int>> vec(myMap.begin(), myMap.end());
- map의 데이터를 벡터로 옮깁니다.
- 벡터로 변환해야 sort() 함수를 이용한 value 기준 정렬이 가능합니다.
- sort(vec.begin(), vec.end(), cmp);
- cmp 기준에 따라 등장 횟수 내림차순, 같을 경우 key 사전순 오름차순 정렬.
- cout << vec[0].first;
- 가장 첫 번째 원소(등장 횟수가 가장 많고, 사전순으로 앞선 문자열)의 key를 출력.
main 함수
- 전체 실행 흐름을 제어합니다.
- Input() → 문자열 개수와 데이터를 입력받음.
- 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();
}'백준 > 정렬' 카테고리의 다른 글
| 백준 13334 c++ "철로" -PlusUltraCode- (0) | 2025.10.29 |
|---|---|
| 백준 1377 c++ "버블 소트" -PlusUltraCode- (0) | 2025.10.21 |
| 백준 10825 c++ "국영수" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 2217 c++ "로프" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 1026 c++ "보물" -PlusUltraCode- (0) | 2025.09.17 |