-
[BOJ / C++] 1270번 : 전쟁 - 땅따먹기Study (etc)/Problem Solving 2023. 1. 23. 20:36
문제
드디어 전쟁은 전면전이 시작되었고, 서로 땅을 따먹기 시작했다.
현재 여러 지역은 한창 전쟁이 벌어지고 있는 상황인데, 어느 지역은 거의 전쟁이 마무리 단계로 가고 있다.
하지만 당신은 군대를 보낼 때 적군을 혼란시키기 위해서 우리 나라의 군대라는걸 표시하지 않고, 군대의 번호로 표시했다.
어느 땅에서 한 번호의 군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에 놓이게 된다.
이때, 각 땅들을 지배한 군대의 번호를 출력하여라. 만약, 아직 전쟁이 한창중인 땅이라면 “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형으로 입력받아 계속 틀렸다.
범위를 간과하지 말자...
1270번: 전쟁 - 땅따먹기
첫째 줄에는 땅의 개수 n(n<=200)이 주어진다. 그리고 두 번째 줄에서 n+1번째 줄에는 제일 처음에 숫자 Ti(i번째 땅의 병사수, Ti<=100,000)와, Ti개의 숫자 (각각 병사의 군대 번호)가 주어진다. i번째 땅
www.acmicpc.net
'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