본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 2660번 회장뽑기

by 현장 2026. 2. 6.

-Code

import java.io.*;
import java.util.*;

public class BOJ2660 {
    static class MemberInfo {
        int num, dist;

        public MemberInfo(int num, int dist) {
            this.num = num;
            this.dist = dist;
        }
    }
    static ArrayList<ArrayList<Integer>> members;
    static boolean[] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        int memberCnt = Integer.parseInt(br.readLine());

        // members 초기화
        members = new ArrayList<>();
        for (int i = 0; i <= memberCnt; i++) {
            members.add(new ArrayList<>());
        }
        // 친구 입력 받기
        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            // 탈출 조건
            if (u == -1 && v == -1) {
                break;
            }
            // members 셋팅
            members.get(u).add(v);
            members.get(v).add(u);
        }
        int[] scores = new int[memberCnt + 1];
        int minScore = Integer.MAX_VALUE;
        for (int i = 1; i <= memberCnt; i++) {
            // visites 초기화
            visited = new boolean[memberCnt + 1];
            scores[i] = getMemberScore(i);
            minScore = Math.min(minScore, scores[i]);
        }
        // 출력
        int candiCnt = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= memberCnt; i++) {
            if (scores[i] == minScore) {
                candiCnt++;
                sb.append(i).append(" ");
            }
        }
        System.out.println(minScore + " " + candiCnt);
        System.out.println(sb);
    }

    private static int getMemberScore(int start) {
        int answer = 0;
        // 방문 및 덱 셋팅
        visited[start] = true;
        Deque<MemberInfo> memberDeq = new ArrayDeque<>();
        memberDeq.addLast(new MemberInfo(start, 0));
        // 탐색
        while (!memberDeq.isEmpty()) {
            MemberInfo now = memberDeq.pollFirst();
            answer = Math.max(answer, now.dist);

            for (int next : members.get(now.num)) {
                if (!visited[next]) {
                    visited[next] = true;
                    memberDeq.addLast(new MemberInfo(next, now.dist + 1));
                }
            }
        }
        return answer;
    }
}

문제를 잘못 이해해서 로직이 짜지지 않아서 찾아보니 가장 어색한 친구를 찾는 문제로 최단 거리 문제라 BFS로 풀 수 있었습니다. 문제 이해를 이상하게 하는 경우가 있어서 더 익숙해져야 겠다고 생각이 들었습니다.