백준 전쟁 - 땅따먹기

KIMYEONGJUN·2024년 12월 18일
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개의 댓글

관련 채용 정보