๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 1043_๊ฑฐ์ง“๋ง

๋ฟŒ์•ผ._. 2023. 6. 26. 15:18

Gold IV

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/1043)

< ๊ฑฐ์ง“๋ง >

 

๋ฌธ์ œ ํ’€์ด & ์ƒ๊ฐ

 

ํŒŒํ‹ฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ํŒŒํ‹ฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํŒŒํ‹ฐ์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ทธ ํ›„์— ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์„ ๊ธฐ์ค€์œผ๋กœ bfs ํƒ์ƒ‰์„ ํ†ตํ•ด ์ง„์‹ค์„ ๋“ฃ๋Š” ์‚ฌ๋žŒ๋“ค์„ ํŒ๋ณ„ํ•œ๋‹ค.

 

์ธ์ ‘๋ฆฌ์ŠคํŠธ์—๋Š” ๋งŒ์•ฝ ํŒŒํ‹ฐ์— 1 2 3์ด ์˜จ๋‹ค๋ฉด (1,2) (1,3) (2,3)์„ ๊ฐ๊ฐ ์ €์žฅํ•œ๋‹ค.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _1043_ { // ๊ฑฐ์ง“๋ง
	static boolean visited[], result[];
	static ArrayList<ArrayList<Integer>> arr, party;

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

		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		visited = new boolean[n + 1];
		result = new boolean[n + 1];
		arr = new ArrayList<>(); // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
		party = new ArrayList<>(); // ํŒŒํ‹ฐ
		for (int i = 0; i < n + 1; i++) {
			arr.add(new ArrayList<>());
		}
		for (int i = 0; i < m; i++) {
			party.add(new ArrayList<>());
		}

		st = new StringTokenizer(bf.readLine());
		int num = Integer.parseInt(st.nextToken());
		for (int i = 0; i < num; i++) {
			int idx = Integer.parseInt(st.nextToken());
			result[idx] = true;
		}

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(bf.readLine());
			num = Integer.parseInt(st.nextToken());
			for (int j = 0; j < num; j++) {
				int idx = Integer.parseInt(st.nextToken());
				party.get(i).add(idx);
			}
			for (int j = 0; j < num; j++) {
				for (int k = j + 1; k < num; k++) {
					int a = party.get(i).get(j);
					int b = party.get(i).get(k);
					arr.get(a).add(b);
					arr.get(b).add(a);
				}
			}
		}
		for (int i = 1; i <= n; i++) {
			if (result[i]) {
				visited[i] = true;
				bfs(i);
			}
		}

		int answer = 0;
		for (int i = 0; i < m; i++) {
			boolean flag = false;
			for (int j = 0; j < party.get(i).size(); j++) {
				if (result[party.get(i).get(j)]) {
					flag = true;
					break;
				}
			}
			if (!flag)
				answer += 1;
		}
		System.out.println(answer);
	}

	private static void bfs(int idx) {
		Queue<Integer> queue = new LinkedList<>();
		queue.add(idx);

		while (!queue.isEmpty()) {
			int num = queue.poll();
			for (int i = 0; i < arr.get(num).size(); i++) {
				int next = arr.get(num).get(i);
				if (!visited[next]) {
					visited[next] = true;
					result[next] = true;
					queue.add(next);
				}
			}
		}
	}
}

 

Main

- ์‚ฌ๋žŒ์˜ ์ˆ˜ (n), ํŒŒํ‹ฐ์˜ ์ˆ˜ (m) ์ž…๋ ฅ

- visited: ๋ฐฉ๋ฌธ ์—ฌ๋ถ€

  result: ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ

  arr : ํŒŒํ‹ฐ์—์„œ ์„œ๋กœ ๋งŒ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค

  party: ํŒŒํ‹ฐ ์ •๋ณด

- ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ ์ˆ˜(num) ์ž…๋ ฅ

- ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ ์ˆ˜๋งŒํผ ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ result๋ฅผ true๋กœ ์ €์žฅ

- ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜(num) ์ž…๋ ฅ

  ํŒŒํ‹ฐ๋งˆ๋‹ค ์˜ค๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋งŒํผ ์‚ฌ๋žŒ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ party ์ •๋ณด ์ €์žฅ ๋ฐ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ €์žฅ

- ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์„ ์‹œ์ž‘์œผ๋กœ ํ•˜์—ฌ bfs ํ•จ์ˆ˜ ํ˜ธ์ถœ

- ํŒŒํ‹ฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘” ๋ฆฌ์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๊ฐ ํŒŒํ‹ฐ์—์„œ ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์—†๋‹ค๋ฉด answer +1

- answer ์ถœ๋ ฅ

 

Search

- queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> num์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํƒ์ƒ‰ํ•˜์—ฌ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ / ์ง„์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์œผ๋กœ ์ €์žฅ / queue์— ์ถ”๊ฐ€