2026. 2. 21. 17:14ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/20113

접근 방법 - 맵을 활용한 값 비교 연산 문제
백준의 20113번 문제는 맵 자료구조를 활용하여 값을 비교하면서 정답을 구할 수 있는 문제이다.
해당 문제는, 각 유저가 임포스터로 지목한 투표 결과가 입력으로 주어질 때 퇴출되는 유저 번호를 구하여 이를 정답으로 출력하면 되는 문제이다.
(가장 많은 표를 받은 유저가 퇴출되고, 투표를 건너뛴 경우의 입력값은 0이다.)
이때, 가장 많은 표를 받은 유저가 2명 이상인 경우에는 아무도 퇴출되지 않는다는 조건이 문제에 명시되어 있다.
맵은 일반적인 배열과는 달리, value 뿐만 아니라 key 값도 직접 제어할 수 있다는 장점을 가진 자료구조이다.
필자는 이러한 맵의 특성을 고려하여, 투표받은 유저의 번호를 key로 그 유저가 받은 총 투표수를 value로 감안하여 문제 해결을 시도해 보았다.
value가 가장 큰 요소가 하나뿐이라면 그에 대응되는 key를 정답으로 출력하였고, value가 가장 큰 요소가 2개 이상이라면 아무도 퇴출되지 않았다는 구문을 출력하게끔 코드를 설계하였다.
보다 자세한 설명은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 유저의 수(n)를 입력받는다.
2) 투표 결과를 저장할 맵 m을 <int, int> 형으로 미리 선언해 둔다.
(key는 투표받은 유저의 번호, value는 그 유저가 받은 총 투표 수로 가정하여 연산을 진행할 예정이다.)
그에 더불어, 총 득표 수의 최댓값을 저장할 변수 max를 0으로 초기화하여 미리 선언해 둔다.
3) n의 크기만큼, 반복문을 수행하여 각 유저가 임포스터로 투표한 유저의 번호(num)를 하나씩 입력받는다.
입력을 받는 대로, 입력값이 0이 아니라면 해당 유저의 득표 수를 증가시키기 위해 m[num]에 1을 추가하도록 한다.
만약 현재의 m[num]이 max보다 큰 값을 가지고 있다면, 현재로서는 m[num]이 득표 수의 최댓값을 의미하기 때문에 max를 해당 값으로 갱신하도록 한다.
4) 퇴출될 예정인 유저의 번호를 저장할 변수 result를 0으로 초기화하여 미리 선언해 둔다.
5) m의 요소 개수만큼, 반복문을 수행하여 하나씩 값 비교를 수행한다.
현재 유저의 득표 수(item.second)가 max와 동일한 요소를 찾았다면, 이에 해당되는 유저는 퇴출될 가능성이 있음을 의미한다.
따라서 이 경우에는, 이 유저의 번호(item.first)를 result의 값으로 갱신하도록 한다.
다만 result가 0 값을 유지하지 못했을 때에 max와 item.second가 동일한 요소를 찾았다면, 이는 퇴출될 가능성이 있는 인원이 2명 이상임을 뜻한다. 이 경우에는, "skipped"를 정답으로 출력하고 즉시 실행을 종료한다.
6) 프로그램이 여전히 실행 중이라면, 최종적으로 저장된 result의 값을 정답으로 출력한 뒤 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <map>
#define endl '\n'
using namespace std;
//백준 20113번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
map<int, int> m;
int max = 0;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
if (num != 0) { m[num]++; }
if (max < m[num]) { max = m[num]; }
}
int result = 0;
for (auto item : m) {
if (item.second == max) {
if (result == 0) {
result = item.first;
}
else {
cout << "skipped" << endl;
return 0;
}
}
}
cout << result << endl;
}
제출 결과

(2026.02.11 백준 20113번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
| [백준 BOJ] 10431번 줄세우기 (C++/cpp) (0) | 2026.03.02 |
|---|---|
| [백준 BOJ] 7576번 토마토 (Java) (2) | 2026.03.01 |
| [백준 BOJ] 2670번 연속부분최대곱 (C++/cpp) (2) | 2026.02.17 |
| [백준 BOJ] 13251번 조약돌 꺼내기 (C++/cpp) (0) | 2026.02.16 |
| [백준 BOJ] 27002번 Max Factor (C++/cpp) (0) | 2026.02.04 |