Tags
- ์๋ฃ๊ตฌ์กฐ
- ์ํ
- queue
- ๊ทธ๋ํ ํ์
- LV2
- CodingTest
- ๊ต์ฌ
- BOJ
- ๋ฐฑํธ๋ํน
- DP
- ๋๋น ์ฐ์ ํ์
- ์ ์๋ก
- Brute Force Algorithm
- sort
- BFS
- dfs
- Dynamic Programming
- ๋ฌธ์์ด
- Study
- PGM
- ์ ๋ ฌ
- ๊น์ด ์ฐ์ ํ์
- stack
- ๊ทธ๋ํ ์ด๋ก
- Java
- ์๋ฎฌ๋ ์ด์
- SpringBoot
- Python
- ๊ตฌํ
- greedy
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_9466 : ํ ํ๋ก์ ํธ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- T๋ฒ์ ํ ์คํธ ์ผ์ด์ค์์์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ค.
- n๋ช (2~10๋ง)์ ํ์ ์๊ฐ ์ฃผ์ด์ง๊ณ , ๋ค์ ์ค์ ๊ฐ ํ์์ด ๊ฐ์ด ํ์ ํ๊ณ ์ถ์ ํ์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค.
- ์๊ธฐ ์์ ์ ๋ฝ๊ฑฐ๋, ํ์ ํ๊ณ ์ถ์ ํ์๋ค๋ผ๋ฆฌ ์ํ๊ตฌ์กฐ(์ํด)์ด ๋ง๋ค์ด์ง๋ฉด ํ์ ๋ง๋ค ์ ์๋ค.
- ์ต์ข ์ ์ผ๋ก ํ์ ์ํ์ง ์์ ํ์์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ์ ํ์๊ฐ 3์ด์ ๊ฐ ํ ์คํธ ์ผ์ด์ค์ n์ด 10๋ง์ด๊ธฐ ๋๋ฌธ์ O(n^2)์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ค.
- ํ์ด ๋ง๋ค์ด์ง๋์ง ํ์ธํ๊ธฐ ์ํด ๊น์ด ์ฐ์ ํ์(DFS)๋ฅผ ์ฌ์ฉํ๋ค.
- DFS์ ๊ฒฝ์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- 1) ํ์ํ๋ค๊ฐ ์์ ๋ฒํธ๋ฅผ ๋ค์ ์ฐพ์ : ํ์ํ ๋ชจ๋ ํ์๋ค์ ๊ฐ์ ํ
- 2) ํ์ํ๋ค๊ฐ ์ค๊ฐ ๋ฒํธ๋ฅผ ๋ค์ ์ฐพ์ : ์ค๊ฐ ๋ฒํธ๊น์ง ํ์ด๊ณ , ์์ ๋ฒํธ๋ถํฐ ์ค๊ฐ ๋ฒํธ ์ฌ์ด๋ ํ์ ๋ง๋ค ์ ์์
- 3) ์ด๋ฏธ ํ ์์์ด ์๋ ๋ฒํธ : ์์ ๋ฒํธ๋ถํฐ ํ์ฌ๊น์ง ๋ชจ๋ ํ์ ๋ง๋ค ์ ์๋ ํ์ ๋ฒํธ
- n๋ช ์ ํ์๋ค์ด ๋ชจ๋ ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก, DFS ํ์์ ํญ์ ์ 3๊ฐ์ง ๊ฒฝ์ฐ์ ๋์ ๋ณด๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ 1๋ฒ๊ณผ 2๋ฒ์ ์ฌ์ค์ ๊ฐ์ ๊ฒฝ์ฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์ค์ํ๊ฑด ํ๋ฒ ํ์ํ ๋ฒํธ๋ ๋ค์ DFS๋ฅผ ํ์ํ์ง ์๊ฒํด์ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[] pick, visited;
private static boolean[] isTeam;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int t = 0; t < T; t++) {
int n = Integer.parseInt(br.readLine());
pick = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
pick[i] = Integer.parseInt(st.nextToken()) - 1;
}
int cnt = 0; // ํ์ด ์๋ ์ ๋ค ์
isTeam = new boolean[n]; // ํ ์์ ์ฌ๋ถ
visited = new int[n]; // ๋ฐฉ๋ฌธ ์ฒดํฌ
Arrays.fill(visited, -1);
for (int i = 0; i < n; i++) {
if (visited[i] == -1 && !isTeam[i]) { // ๋ฐฉ๋ฌธ ์ํ๊ณ , ํ ์์ผ๋ฉด dfs ๋๋ฆผ
dfs(i, i);
}
if (!isTeam[i]) { // dfs ํ์๋ ํ ์์ผ๋ฉด ์นด์ดํธ
cnt++;
}
}
sb.append(cnt).append('\n');
}
bw.write(sb.toString());
bw.flush();
}
private static int dfs(int now, int start) {
// ๋ฐฉ๋ฌธ ํ์์
if (visited[now] > -1) {
if (visited[now] == start) { // ํ์ฌ ํ์์ ๋ฐฉ๋ฌธํจ : ์ํด ๋ฐ์
isTeam[now] = true;
return now;
} else { // ํ์ด ์์ or ์ด์ ๋ฐฉ๋ฌธ
return -1;
}
}
visited[now] = start;
// ์ฌ๊ท
int result = dfs(pick[now], start);
if (result > -1 && now != result) { // ํ์ฌ ์ํด ์์ชฝ์
isTeam[now] = true;
return result;
}
// ์ฌ๊ท ๋๋์ ๊ฐ๋ฉฐ ์ฒ๋ฆฌ ํ ๊ฑฐ ์์, ์ํด์ข
๋ฃ
return -1;
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ํ์ ๋ณ ์ ํ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ int ๋ฐฐ์ด pick, ํ ์์์ด ์์์ ๋ํ๋ด๋ boolean ๋ฐฐ์ด isTeam, ํ์ ์ ์์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ int๋ฐฐ์ด visited๋ฅผ ์ฌ์ฉํ๋ค.
- n๊ฐ์ ๋ฒํธ์ ๋ค์๊ณผ ๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์๊ณ , ํ์ด ์์ผ๋ฉด dfs() ๋ฉ์๋๋ฅผ ๋๋ฆฐ๋ค.
- ์ดํ์๋ ํ์ด ์์ผ๋ฉด cnt๋ฅผ +1 ํ๋ค.
- dfs ์ฌ๊ท ๋ฉ์๋์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ค.
- ๋ฐฉ๋ฌธ ํ์ธ
- ํ์ฌ ํ์์ ๋ฐฉ๋ฌธํ๋ ๋ฒํธ๋ผ๋ฉด, ์ํด์ด ๋ฐ์ํ ๊ฒ์ด๋ฏ๋ก, ๋ค์ ํ์ฌ ๋ฒํธ๊ฐ ๋์ฌ ๋ ๊น์ง isTeam[now]์ true๋ก ์ ์ํ๊ณ now๋ฅผ ๋ฐํํ๋ค.
- ์ด์ ํ์ ๋ฐฉ๋ฌธํ๋ ๋ฒํธ๋ผ๋ฉด, ์ํด์ด ๋ง๋ค์ด์ง์ง ์์ผ๋ฏ๋ก -1์ ๋ฐํํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์๋ ๋ฒํธ๋ผ๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค.
- ์ฌ๊ท ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
- dfs(pick[now], start) ๋ก ๋ค์ ์ฌ๊ท ๋ฉ์๋๋ฅผ ์คํํ๋ค.
- ๋ง์ฝ ์ฌ๊ท ๋ฉ์๋์ ๋ฐํ๊ฐ result๊ฐ 0์ด์์ด๊ณ now์ ๋ค๋ฅด๋ค๋ฉด, ์ํด ์ค๊ฐ์ด๋ฏ๋ก istTeam[now]๋ฅผ true๋ก ๋ฐ๊ฟ์ฃผ๊ณ result๋ฅผ ๋ฐํํ๋ค.
- result๊ฐ -1์ด๊ฑฐ๋ result == now๋ผ๋ฉด ์ํด์ด ์ข ๋ฃ๋ ๊ฒ์ด๋ฏ๋ก -1์ ๋ฐํํ๋ค.
- ๋ฐฉ๋ฌธ ํ์ธ
๐ธ end ๐ธ
- ๋จ์ํ DFS ์๊ณ ๋ฆฌ์ฆ๋ง ํ์ํ ๋ฌธ์ ์ธ๋ฐ, ๋์ด๋๊ฐ ๊ฝค ๋์๋ ๊ฒ ๊ฐ๋ค.
- ๊ฐ ํ ์คํธ ์ผ์ด์ค ์คํ์ ์๊ฐ ๋ณต์ก๋๋ฅผ O(n)์ผ๋ก ํด์ผ๋ผ์ 1ํ ์๊ฐ ์ด๊ณผ ๋ฌ๋ค.
- 2๋ฒ์งธ ์ ์ถ์ ํ๋ ธ์ต๋๋ค๋ ์ด์ ํ์์์ ํ์ด ์์์ ์์๋๋ฐ, ํ์ฌ ํ์์์ ๋ค์ ๋ฐฉ๋ฌธํด์ผ ํ ๊ฒฝ์ฐ์ ์ค๋ฅ๊ฐ ๋์ ํ๋ ธ๋ค. visited๋ฅผ ์ฒ์์ boolean ๋ฐฐ์ด๋ก ๋๋ค๊ฐ, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด start๋ฅผ ๊ธฐ๋กํ๊ณ visited๋ฅผ int๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ ์ฒ๋ฆฌํ๋ค.
- ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ๋ค์ํ๊ฒ ์๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
- ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ค์ํ๊ฒ ๋๋ ค๋ณด๋ฉด์ ๋๋ฒ๊น ํ๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ์์, ์ง์ ๋ง๋ค๊ธฐ๋ ํ๊ณ ์ง๋ฌธ ๊ฒ์ํ์ ์๋ ๋ฐ๋ก๋ค์ ๋ชจ์ผ๊ธฐ๋ ํ๋ค.
- ํ ์คํธ ์ผ์ด์ค ๋ชจ์์ ์ง๋ฌธ ๊ฒ์ํ์ ๋จ๊ฒจ๋์๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_11066 : ํ์ผ ํฉ์น๊ธฐ (0) | 2024.05.24 |
---|---|
BOJ_11049 : ํ๋ ฌ ๊ณฑ์ ์์ (0) | 2024.05.23 |
BOJ_1062 : ๊ฐ๋ฅด์นจ (0) | 2024.05.20 |
[ํ๊ธฐ] ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ์ ๋ฌธ์ญ๋์ธ์ฆ(PCCP) Lv3 ์ทจ๋ (0) | 2024.05.20 |
BOJ_5052 : ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2024.05.19 |