문제
드디어 전쟁은 전면전이 시작되었고, 서로 땅을 따먹기 시작했다.
현재 여러 지역은 한창 전쟁이 벌어지고 있는 상황인데, 어느 지역은 거의 전쟁이 마무리 단계로 가고 있다.
하지만 당신은 군대를 보낼 때 적군을 혼란시키기 위해서 우리 나라의 군대라는걸 표시하지 않고, 군대의 번호로 표시했다.
어느 땅에서 한 번호의 군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에 놓이게 된다.
이때, 각 땅들을 지배한 군대의 번호를 출력하여라. 만약, 아직 전쟁이 한창중인 땅이라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.
입력
첫째 줄에는 땅의 개수 n(n<=200)이 주어진다. 그리고 두 번째 줄에서 n+1번째 줄에는 제일 처음에 숫자 Ti(i번째 땅의 병사수, Ti<=100,000)와, Ti개의 숫자 (각각 병사의 군대 번호)가 주어진다. i번째 땅의 j번째 병사 번호 Nij가 주어진다. ( | Nij | <= 2^31 )
출력
첫째 줄에는 각각의 땅의 상태를 순서대로 출력한다. 만약 땅이 지배가 되어있다면 그 지배한 병사의 번호를 출력하고, 아니라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.
Solved.ac 레벨
실버 III
풀이
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
while(n--){
int t;
cin >> t;
map<long long, int> army;
for(int j = 0; j < t; j++){
long long num;
cin >> num;
if(army.find(num) == army.end()){
//map에 해당 번호를 가진 군대의 병사가 존재하지 않을 경우
//해당 번호를 key로 갖는 쌍을 map에 삽입
army.insert(make_pair(num, 1));
} else{
//map에 해당 번호를 가진 군대의 병사가 존재할 경우
//해당 번호를 key로 갖는 value를 증가
army.find(num)->second++;
}
}
int maxVal = 0; //가장 큰 value를 판별하기 위함.
long long result = 0; //가장 큰 value를 가지는 key를 저장하기 위함.
for(auto it = army.begin(); it != army.end(); it++){
//반복자를 이용하여 순회하며 최대값 판별
if(it->second > maxVal){
maxVal = it->second;
result = it->first;
}
}
if(maxVal > (t/2)){
cout << result << "\n";
} else {
cout << "SYJKGW\n";
}
}
return 0;
}
해시맵을 활용하는 문제였다. 처음부터 로직은 잘 구성했는데 범위가 2^31 까지라는 것을 간과하여 계속 int형으로 입력받아 계속 틀렸다.
범위를 간과하지 말자...
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 11478번 : 서로 다른 부분 문자열의 개수 (0) | 2023.01.27 |
---|---|
[BOJ / C++] 15649번 : N과 M (1) (0) | 2023.01.24 |
[BOJ / C++] 2845번 : 파티가 끝나고 난 뒤 (0) | 2023.01.23 |
[BOJ / C++] 15963번 : CASIO (0) | 2023.01.23 |
[BOJ / Python3] 20499번 : Darius님 한타 안 함? (1) | 2023.01.23 |