[BOJ] 1043.๊ฑฐ์ง๋ง (Java)
by ๋๋ถ๋
1043๋ฒ: ๊ฑฐ์ง๋ง
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ
www.acmicpc.net
์ด ๋ฌธ์ ๋ ์ฌ๋ ์ N, ํํฐ ์ M, ์ง์ค์ ์๋ ์ฌ๋ ์์ ๋ฒํธ, M๊ฐ ํํฐ์ ์ค๋ ์ฌ๋ ์์ ๋ฒํธ๊ฐ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๋ฏผ์ด๊ฐ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง์ง ์์ผ๋ฉด์ ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ํ ์ ์๋ ํํฐ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ์์ต๋๋ค.
- ์ง์ค์ ์๋ ์ฌ๋, ๊ฐ ํํฐ๋ณ ์ฐธ๊ฐ์, ๋ชจ๋ ์ฌ๋์ ํํฐ ์ฐธ๊ฐ์ ๋ํ ๊ธฐ๋ก์ ๋ง๋ค์์ต๋๋ค.
- bfs ์ํ์ ์ํด ์ฌ๋ ํ์ธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ ๋ฐฐ์ด์ ํ๋ ์์ฑํ ํ, Queue์ ์ง์ค์ ์๋ ์ฌ๋์ ์ถ๊ฐํฉ๋๋ค.
- poll์ ํตํด ๊ฐ์ ธ์จ ์ง์ค์ ์๋ ์ฌ๋์ ๋ํด ํ์ธํ์์ ํ์ํด์ค๋๋ค.
- ์ง์ค์ ์๋ ์ฌ๋์ด ์ฐธ์ํ ํํฐ๋ฅผ true๋ก ๋ฐ๊ฟ์ค๋๋ค.
- ์ง์ค์ ์๋ ์ฌ๋์ด ์ฐธ๊ฐํ ํํฐ์ ์ํ ์ฌ๋๋ค ์ค ํ์ธํ์ง ์์ ์ฌ๋์ 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
๋๋ถ๋