๋šœ๋ถ€๋‹ˆ์˜ Devlog

[BOJ] 1043.๊ฑฐ์ง“๋ง (Java)

by ๋šœ๋ถ€๋‹ˆ

 

 

1043๋ฒˆ: ๊ฑฐ์ง“๋ง

์ง€๋ฏผ์ด๋Š” ํŒŒํ‹ฐ์— ๊ฐ€์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ํŒŒํ‹ฐ์— ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ์ง€๋ฏผ์ด๋Š” ์ง€๋ฏผ์ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค. ์ง€๋ฏผ์ด๋Š” ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•  ๋•Œ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง„์‹ค๋กœ ๋งํ•˜๊ฑฐ๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ

www.acmicpc.net

์ด ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ ์ˆ˜ N, ํŒŒํ‹ฐ ์ˆ˜ M, ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ ์ˆ˜์™€ ๋ฒˆํ˜ธ, M๊ฐœ ํŒŒํ‹ฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ ์ˆ˜์™€ ๋ฒˆํ˜ธ๊ฐ€ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๋ฏผ์ด๊ฐ€ ๊ฑฐ์ง“๋ง์Ÿ์ด๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์œผ๋ฉด์„œ ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํ‹ฐ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ, ๊ฐ ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž, ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํŒŒํ‹ฐ ์ฐธ๊ฐ€์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  2. bfs ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์‚ฌ๋žŒ ํ™•์ธ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•  ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ ํ›„, Queue์— ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. poll์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•ด ํ™•์ธํ–ˆ์Œ์„ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค.
  4. ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฐธ์„ํ•œ ํŒŒํ‹ฐ๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.
  5. ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฐธ๊ฐ€ํ•œ ํŒŒํ‹ฐ์— ์†ํ•œ ์‚ฌ๋žŒ๋“ค ์ค‘ ํ™•์ธํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ์„ Queue์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
import java.io.*;
import java.util.*;

class Main {

    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); // ์‚ฌ๋žŒ ์ˆ˜
        int M = Integer.parseInt(st.nextToken()); // ํŒŒํ‹ฐ ์ˆ˜
        boolean[] isParty = new boolean[M]; // ์ง„์‹ค์„ ๋งํ•ด์•ผํ•˜๋Š” ํŒŒํ‹ฐ์ธ์ง€ ์•„๋‹Œ์ง€ ๊ธฐ๋ก
        ArrayList<Integer>[] partyAttend = new ArrayList[N+1]; // ์‚ฌ๋žŒ๋ณ„ ํŒŒํ‹ฐ์ฐธ๊ฐ€ ๊ธฐ๋ก
        for (int i = 1; i <= N; i++) partyAttend[i] = new ArrayList<>();

        st = new StringTokenizer(br.readLine());
        int knowNum = Integer.parseInt(st.nextToken()); // ์ง„์‹ค์„ ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ ์ˆ˜
        if (knowNum == 0) { // ์ง„์‹ค์„ ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์—†๋Š” ๊ฒฝ์šฐ
            bw.write(String.valueOf(M)); // ๋ชจ๋“  ํŒŒํ‹ฐ์— ๊ณผ์žฅ๋œ ์ด์•ผ๊ธฐ ๊ฐ€๋Šฅ
        }
        else { // ์ง„์‹ค์„ ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
            int[] know = new int[knowNum]; // ์ง„์‹ค์„ ๋งํ•˜๋Š” ์‚ฌ๋žŒ ๊ธฐ๋ก
            for (int i = 0; i < knowNum; i++) {
                know[i] = Integer.parseInt(st.nextToken());
            }

            int[][] party = new int[M][]; // ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž ๊ธฐ๋ก
            for (int i = 0; i < M; i++) {
                st = new StringTokenizer(br.readLine());
                int partyAttendNum = Integer.parseInt(st.nextToken()); // ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž ์ˆ˜
                party[i] = new int[partyAttendNum]; // ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž ๊ธฐ๋ก
                for (int j = 0; j < partyAttendNum; j++) {
                    int temp = Integer.parseInt(st.nextToken());
                    party[i][j] = temp; // ํŒŒํ‹ฐ์— ์ฐธ๊ฐ€ํ•˜๋Š” ์‚ฌ๋žŒ ๊ธฐ๋ก
                    partyAttend[temp].add(i); // ์‚ฌ๋žŒ๋ณ„ ์ฐธ๊ฐ€ํ•œ ํŒŒํ‹ฐ ๊ธฐ๋ก
                }
            }
            bfs(N, isParty, knowNum, know, party, partyAttend);

            int cnt = 0;
            for (int i = 0; i < M; i++) {
                if (!isParty[i]) cnt++;
            }
            bw.write(String.valueOf(cnt));
        }

        bw.flush();
        bw.close();
        br.close();

    }

    /** bfs
     *
     * @param N ์‚ฌ๋žŒ ์ˆ˜
     * @param isParty ํŒŒํ‹ฐ์— ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ์ฒดํฌ
     * @param knowNum ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ ์ˆ˜
     * @param know ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค
     * @param party ํŒŒํ‹ฐ๋ณ„ ์ฐธ๊ฐ€์ž
     * @param partyAttend ์‚ฌ๋žŒ๋“ค์˜ ํŒŒํ‹ฐ ์ฐธ๊ฐ€ ๊ธฐ๋ก
     * @return isParty ์˜ ํŒŒํ‹ฐ ์ฐธ๊ฐ€ ๊ธฐ๋ก ๊ฒฐ๊ณผ
     */
    public static boolean[] bfs(int N, boolean[] isParty, int knowNum, int[] know, int[][] party, ArrayList<Integer>[] partyAttend) {
        Queue<Integer> queue = new LinkedList<>();
        boolean[] isVisited = new boolean[N+1]; // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ํ™•์ธ์šฉ

        for (int i = 0; i < knowNum; i++) { // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์„ ํ์— ์ถ”๊ฐ€
            queue.add(know[i]);
        }

        while(!queue.isEmpty()) {
            int truePeople = queue.poll(); // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ
            isVisited[truePeople] = true;
            for (int i = 0; i < partyAttend[truePeople].size(); i++) {
                int attendPartyNum = partyAttend[truePeople].get(i); // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฐธ๊ฐ€ํ•œ ํŒŒํ‹ฐ
                isParty[attendPartyNum] = true;
                for (int j = 0; j < party[attendPartyNum].length; j++) { // ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ฐธ์—ฌํ•œ ํŒŒํ‹ฐ์˜ ์ฐธ๊ฐ€์ž๋“ค์— ๋Œ€ํ•ด
                    if (!isVisited[party[attendPartyNum][j]]){ // ์•„์ง ํ™•์ธํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ์ธ ๊ฒฝ์šฐ
                        queue.add(party[attendPartyNum][j]);
                    }
                }
            }

        }

        return isParty;
    }

}
 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 12094.A์™€ B (Java)  (0) 2021.06.10
[BOJ] 10159.์ €์šธ (Java)  (0) 2021.05.02
[BOJ] 5430.AC (Java)  (0) 2021.04.30
[BOJ] 5052.์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก (Java)  (0) 2021.04.30
[BOJ] 11720.์ˆซ์ž์˜ ํ•ฉ (Java)  (0) 2021.04.27

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

๋šœ๋ถ€๋‹ˆ์˜ Devlog

๋šœ๋ถ€๋‹ˆ

ํ™œ๋™ํ•˜๊ธฐ