본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 1270번 : 전쟁 - 땅따먹기

by Haren 2023. 1. 23.

문제

드디어 전쟁은 전면전이 시작되었고, 서로 땅을 따먹기 시작했다.

현재 여러 지역은 한창 전쟁이 벌어지고 있는 상황인데, 어느 지역은 거의 전쟁이 마무리 단계로 가고 있다.

하지만 당신은 군대를 보낼 때 적군을 혼란시키기 위해서 우리 나라의 군대라는걸 표시하지 않고, 군대의 번호로 표시했다.

어느 땅에서 한 번호의 군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에 놓이게 된다.

이때, 각 땅들을 지배한 군대의 번호를 출력하여라. 만약, 아직 전쟁이 한창중인 땅이라면 “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