λšœλΆ€λ‹ˆμ˜ Devlog

[BOJ] 2660.회μž₯ 뽑기 (Java, BFS)

by λšœλΆ€λ‹ˆ

 

 

2660번: 회μž₯뽑기

μž…λ ₯의 첫째 μ€„μ—λŠ” νšŒμ›μ˜ μˆ˜κ°€ μžˆλ‹€. 단, νšŒμ›μ˜ μˆ˜λŠ” 50λͺ…을 λ„˜μ§€ μ•ŠλŠ”λ‹€. λ‘˜μ§Έ 쀄 μ΄ν›„λ‘œλŠ” ν•œ 쀄에 두 개의 νšŒμ›λ²ˆν˜Έκ°€ μžˆλŠ”λ°, 이것은 두 νšŒμ›μ΄ μ„œλ‘œ μΉœκ΅¬μž„μ„ λ‚˜νƒ€λ‚Έλ‹€. νšŒμ›λ²ˆν˜ΈλŠ” 1λΆ€ν„°

www.acmicpc.net

문제λ₯Ό 처음 봀을 λ•Œ 이해가 가지 μ•Šμ•„μ„œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. 문제 μ„€λͺ…을 μ™œ μ΄λ ‡κ²Œ ν–ˆμ„κΉŒ 😞😞

 

문제 μ΄ν•΄ν•˜κΈ°

  1. 회μž₯은 μ μˆ˜κ°€ κ°€μž₯ 적은 μ‚¬λžŒμ΄ λ©λ‹ˆλ‹€.
  2. 점수 계산 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    1점 : AνšŒμ›μ΄ BνšŒμ›κ³Ό 친ꡬ 관계 (A-B)
    2점 : AνšŒμ›μ΄ BνšŒμ›κ³Ό 친ꡬ κ΄€κ³„μ΄λ©΄μ„œ, BνšŒμ›μ˜ 친ꡬ인 CνšŒμ›κ³Όλ„ 친ꡬ 관계 (A-B-C)
    3점 : AνšŒμ›μ΄ BνšŒμ›κ³Ό 친ꡬ κ΄€κ³„μ΄λ©΄μ„œ, BνšŒμ›μ˜ 친ꡬ인 CνšŒμ›κ³Όλ„ 친ꡬ κ΄€κ³„μ΄λ©΄μ„œ, CνšŒμ›μ˜ 친ꡬ인 DνšŒμ›κ³Όλ„ 친ꡬ 관계 (A-B-C-D)

    이런 μ‹μœΌλ‘œ κ΄€κ³„μžˆλŠ” μ‚¬λžŒμ΄ λ§Žμ•„μ§ˆ 수둝 μ μˆ˜λ„ 점점 μ»€μ§‘λ‹ˆλ‹€.
    νšŒμ›μ΄ κ°€μ§ˆ 수 μžˆλŠ” 점수 쀑 κ°€μž₯ 큰 점수λ₯Ό νšŒμ›μ˜ 점수둜 κ°€μ§‘λ‹ˆλ‹€.
  3. νšŒμ› μˆ˜λŠ” 50λͺ…을 λ„˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  4. μž…λ ₯ : 첫째 쀄 νšŒμ› 수, λ‘˜μ§Έ 쀄뢀터 νšŒμ›λ“€ 친ꡬ 관계, λ§ˆμ§€λ§‰ 쀄은 -1 두 개
  5. 좜λ ₯ : 첫째 쀄 회μž₯ 후보 μ μˆ˜μ™€ 후보 수, λ‘˜μ§Έ 쀄 회μž₯ 후보 μ˜€λ¦„μ°¨μˆœ

 

예제 μ‚΄νŽ΄λ³΄κΈ°

μ˜ˆμ œμ— 주어진 5λͺ…μ˜ νšŒμ›λ“€μ˜ κ΄€κ³„λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

각 관계에 λŒ€ν•΄ 점수둜 λ‚˜νƒ€λ‚΄λ΄…μ‹œλ‹€.

  1 2 3 4 5
1 0 1 2 2 3
2 1 0 1 1 2
3 2 1 0 1 1
4 2 1 1 0 1
5 3 2 1 1 0

받은 점수의 졜고 점수λ₯Ό 계산해보면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

1 2 3 4 5
3 2 2 2 3

μ—¬κΈ°μ„œ κ°€μž₯ μž‘μ€ μ μˆ˜λŠ” 2μ μ΄λ―€λ‘œ, 회μž₯ 후보 μ μˆ˜λŠ” 2점이 λ©λ‹ˆλ‹€. 그리고 회μž₯ ν›„λ³΄λŠ” 2, 3, 4둜 3λͺ…μž…λ‹ˆλ‹€.

λ”°λΌμ„œ μ•„λž˜μ™€ 같이 좜λ ₯λ©λ‹ˆλ‹€.

2 3
2 3 4

문제 풀어보기

μ—¬κΈ°μ„œλŠ” λ„ˆλΉ„ μš°μ„  νƒμƒ‰μœΌλ‘œ ν’€μ–΄λ³Ό μ˜ˆμ • (ν”Œλ‘œμ΄λ“œ-μ›Œμ…œλ‘œλ„ ν’€ 수 있음)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int memberNum = input.nextInt() + 1; // νšŒμ› λ²ˆν˜Έκ°€ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ memberNum 을 1개 λŠ˜λ €μ€€λ‹€!
        boolean[][] memberRelations = new boolean[memberNum][memberNum];

        while (true) {
            int i = input.nextInt();
            int j = input.nextInt();

            if (i == -1 && j == -1) break;

            memberRelations[i][j] = true;
            memberRelations[j][i] = true;
        }

        solution(memberNum, memberRelations);

    }

    private static void solution(int memberNum, boolean[][] memberRelations) {
        List<Integer> candidates = new ArrayList<>();
        int minScore = Integer.MAX_VALUE;


        // 각 멀버 점수 계산
        for (int i = 1; i < memberNum; i++) {
            int[] scores = new int[memberNum];
            Arrays.fill(scores, -1);
            Queue<Integer> nextMembers = new LinkedList<>();
            nextMembers.add(i);
            scores[i] = 0;

            while (!nextMembers.isEmpty()) {
                int member = nextMembers.poll();

                for (int j = 1; j < memberNum; j++) {
                    if (memberRelations[member][j] && scores[j] < 0) {
                        nextMembers.add(j);
                        scores[j] = scores[member] + 1;
                    }
                }
            }
            int score = Arrays.stream(scores).max().getAsInt();

            if (score > minScore) continue;

            if (score < minScore) {
                minScore = score;
                candidates = new ArrayList<>();

            }
            candidates.add(i);
        }

        Collections.sort(candidates);

        // κ²°κ³Ό 좜λ ₯
        System.out.println(minScore + " " + candidates.size());
        candidates.forEach(candidate -> System.out.print(candidate + " "));
    }
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 2016.λ―ΈνŒ…μ£Όμ„ ν•˜κΈ°  (0) 2022.06.13
[BOJ] 2615.였λͺ© (Java)  (0) 2022.04.21
[BOJ] 1759.μ•”ν˜Έλ§Œλ“€κΈ° (Java)  (0) 2021.06.20
[BOJ] 12094.A와 B (Java)  (0) 2021.06.10
[BOJ] 10159.μ €μšΈ (Java)  (0) 2021.05.02

λΈ”λ‘œκ·Έμ˜ 정보

λšœλΆ€λ‹ˆμ˜ Devlog

λšœλΆ€λ‹ˆ

ν™œλ™ν•˜κΈ°