백준 전쟁 - 땅따먹기

KIMYEONGJUN·4일 전
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에는 땅의 개수 N(N<=200)이 주어진다.
그리고 두 번째 줄에서 N+1번째 줄에는 제일 처음에 숫자 Ti(i번째 땅의 병사수, Ti<=100,000)와, Ti개의 숫자 (각각 병사의 군대 번호)가 주어진다.
i번째 땅의 j번째 병사 번호 Nij가 주어진다. ( | Nij | <= 2^31 )

첫째 줄에는 각각의 땅의 상태를 순서대로 출력한다.
만약 땅이 지배가 되어있다면 그 지배한 병사의 번호를 출력하고, 아니라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader를 사용하여 표준 입력을 처리한다.
첫 번째 줄에서 땅의 개수 n을 읽어 정수로 변환해준다.
StringBuilder를 사용하여 결과를 저장해준다.
각 땅에 대한 처리:
for 루프를 사용하여 각 땅에 대해 반복해준다.
각 땅의 병사 수와 병사 번호를 입력받아 inputs 배열에 저장한다.
Ti는 해당 땅의 병사 수이다.
HashMap<Long, Integer>를 사용하여 각 군대의 병사 수를 세기 위한 맵을 초기화해준다.
병사 수 세기:
두 번째 for 루프를 사용하여 각 병사 번호를 읽는다.
병사 번호는 Long으로 변환하여 armyNumber에 저장해준다.
armyCount 맵에 병사 번호를 키로 하여 해당 군대의 병사 수를 증가시킨다.
getOrDefault 메서드를 사용하여 초기값을 0으로 설정하고, 병사 수를 1 증가시킨다.
지배하는 군대 찾기:
majorityArmy와 maxCount 변수를 초기화한다.
armyCount 맵을 반복하여 각 군대의 병사 수를 확인한다.
병사 수가 전체 병사 수의 절반을 초과하면, 그 군대의 병사 수가 현재 최대 병사 수보다 크면 majorityArmy를 업데이트한다.
결과 추가:
majorityArmy가 -1이 아닌 경우, 즉 지배 군대가 존재하는 경우에는 해당 군대 번호를 결과에 추가해준다.
그렇지 않은 경우 "SYJKGW"를 결과에 추가해준다.
그리고 최종 결과를 출력해준다.

코드로 구현

package baekjoon.baekjoon_25;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

// 백준 1270번 문제
public class Main871 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < n; i++) {
            String[] inputs = br.readLine().trim().split(" ");
            int Ti = Integer.parseInt(inputs[0]);
            Map<Long, Integer> armyCount = new HashMap<>();

            // 병사 수 세기
            for(int j = 1; j <= Ti; j++) {
                if(j < inputs.length) {
                    long armyNumber = Long.parseLong(inputs[j]);
                    armyCount.put(armyNumber, armyCount.getOrDefault(armyNumber, 0) + 1);
                }
            }

            // 지배하는 군대 찾기
            long majorityArmy = -1;
            int maxCount = 0;
            for(Map.Entry<Long, Integer> entry : armyCount.entrySet()) {
                if(entry.getValue() > Ti / 2) {
                    if(entry.getValue() > maxCount) {
                        majorityArmy = entry.getKey();
                        maxCount = entry.getValue();
                    }
                }
            }

            // 결과 추가
            if(majorityArmy != -1) {
                sb.append(majorityArmy).append("\n");
            } else {
                sb.append("SYJKGW\n");
            }
        }

        System.out.print(sb.toString());
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글