๋ฌธ์
ํ์ด
1๏ธโฃ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
์ด ๋ฌธ์ ๋ ํํฐ๋ณ๋ก ๋ฐ๋ก ์ฒดํฌ๋ฅผ ํ ์ ์๋ ๋ฌธ์ ์ด๊ณ , ๋ชจ๋ ํํฐ์ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ ๋ค์์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
๊ทธ ์ด์ ๋
์์ ์ฒ๋ผ
4 5
1 1
1 1
1 2
1 3
1 4
2 4 1
์์ ๊ฐ์ด ์ฃผ์ด์ก์ ๋,
4๋ฒ์งธ ํํฐ์ธ
1 4
์์๋ 4๋ฒ์ด ์ง์ค์ ๋ชจ๋ฅผ๊ฒ ๊ฐ์ง๋ง
5๋ฒ์งธ ํํฐ์์ ์ง์ค์ ์๋ 1๋ฒ์ด 4๋ฒ์๊ฒ ์๋ ค ์ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ์์ฐจ์ ์ผ๋ก ํ๋จํ ์ ์๋ค.
๋ด๊ฐ ์๊ฐํ ์ ๋ต์ ์ง๋ฏผ์ด๋ฅผ 0๋ฒ์ผ๋ก ๋๊ณ ๋๋จธ์ง 1๋ฒ๋ถํฐ N๋ฒ์ ์ฌ๋๋ค์ ๊ทธ๋ํ๋ฅผ ์ ์ํ๊ณ
์ง์ค์ ์๋ ๋ฒํธ์ ์ง๋ฏผ์ด์ ๋ฒํธ์ธ 0 ๋ฒ์ ๋จผ์ ์ฐ๊ฒฐํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ฐ ํํฐ๋ณ๋ก ๋ง๋๋ ์ฌ๋๋ค ๊ฐ์ ์ฐ๊ฒฐ์ ํด์ค๋ค.
๋ง์ง๋ง์ผ๋ก ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ง๋ฏผ์ด์ ๋ฒํธ์ธ 0 ๋ฒ๊ณผ ๊ฑฐ๋ฆฌ์ ์๊ด์์ด ์ฐ๊ฒฐ๋๋ ๋ ธ๋๋ผ๋ฉด ์ง์ค์ ์๊ฒ๋๋ ์ฌ๋์์ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํํฐ๋ณ๋ก ์ํํ๋ฉด์ 0๋ฒ๊ณผ ์ฐ๊ฒฐ๋ ๋ฒํธ๊ฐ ํ๋๋ผ๋ ์๋ ๊ฒฝ์ฐ์ ์นด์ดํ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์๋ค.
public class Main {
static final int MAX = 100;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int M = Integer.parseInt(input[1]);
// ์ง๋ฏผ์ด ๋ฒํธ๋ 0 ์ผ๋ก ๊ฐ์
int[][] graph = new int[N + 1][N + 1];
for (int r = 0; r < N + 1; r++) {
for (int c = 0; c < N + 1; c++) {
if (r != c) {
graph[r][c] = MAX;
}
}
}
List<List<Integer>> parties = new ArrayList<>();
input = br.readLine().split(" ");
int numOfKnow = Integer.parseInt(input[0]);
// ์ง์ค์ ์๋ ์ฌ๋์ ์ง๋ฏผ์ด ๋ฒํธ (0) ๊ณผ ์ฐ๊ฒฐ
for (int i = 1; i <= numOfKnow; i++) {
graph[0][Integer.parseInt(input[i])] = 1;
graph[Integer.parseInt(input[i])][0] = 1;
}
for (int i = 0; i < M; i++) {
input = br.readLine().split(" ");
List<Integer> party = new ArrayList<>();
int numOfPeople = Integer.parseInt(input[0]);
// ๊ฐ์ ํํฐ์ ์ฐธ์ํ๋ ์ฌ๋๋ค๋ผ๋ฆฌ ์ฐ๊ฒฐ
for (int j = 1; j <= numOfPeople; j++) {
party.add(Integer.parseInt(input[j]));
for (int k = j + 1; k <= numOfPeople; k++) {
graph[Integer.parseInt(input[j])][Integer.parseInt(input[k])] = 1;
graph[Integer.parseInt(input[k])][Integer.parseInt(input[j])] = 1;
}
}
parties.add(party);
}
// ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
for (int m = 0; m < N + 1; m++) {
for (int u = 0; u < N + 1; u++) {
for (int v = 0; v < N + 1; v++) {
graph[u][v] = Math.min(graph[u][v], graph[u][m] + graph[m][v]);
}
}
}
int ans = 0;
// ์ง๋ฏผ์ด ๋ฒํธ์ธ 0๋ฒ์์ ํน์ ๋ฒํธ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์์ผ ์ง์ค์ ์๋ ์ฌ๋์ด ์๋ ํํฐ
for (List<Integer> party : parties) {
boolean flag = true;
for (int num : party) {
if (graph[0][num] != MAX) {
flag = false;
break;
}
}
if (flag) {
ans++;
}
}
System.out.println(ans);
}
}
๊ฒฐ๊ณผ