์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ์์๋ฒํธ
- tcp ์ธ๊ทธ๋จผํธ
- mariadb
- ํ๋ ์ ๊ตฌ์กฐ
- ์ฝ๋ฉํ ์คํธ์ค๋น
- i-type
- reducible
- ์ฐ๋ถํฌdb
- ๊ฐ๋ฐ์์ทจ์
- ๋ฐ์ดํฐ ์ ์ก
- ๋น์ฃผ๊ธฐ์ ํธ
- ์ค๋ธ์
- xv6
- well known ํฌํธ
- til
- ํ๋ก์ด๋์์
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ํญํด99
- git merge
- ์ค๋ ๋
- tcp ํ๋กํ ์ฝ
- 99ํด๋ฝ
- leetcode
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ค๋ฅ๊ฒ์ถ
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- ํ ํฐ ๋ฒ์ค
- ์ค๋ฅ์ ์ด
- IEEE 802
- ์ฃผ๊ธฐ์ ํธ
- Today
- Total
Unfazedโ๏ธ๐ฏ
[Java] ํ๋ก์ด๋-์์ , DFS | ๋ฐฑ์ค 2458 ํค ์์ ๋ณธ๋ฌธ
[Java] ํ๋ก์ด๋-์์ , DFS | ๋ฐฑ์ค 2458 ํค ์์
9taetae9 2024. 11. 3. 10:59https://www.acmicpc.net/problem/2458
์ ๊ทผ ๋ฐฉ๋ฒ
์ฒซ์ ๊ทผ(์คํจ)
๋ฌธ์ ์ ํ์ ๋ณด์ง ์๊ณ ํ์ด๋ณด์์ ๋ ์ผ์ฐจ์ ํ
์ด๋ธ์ ๋ง๋ค๊ณ
๊ด๊ณ๊ฐ ์ฃผ์ด์ง ๋, a > b์ธ ๊ฒฝ์ฐ, ๋ฐฐ์ด์์ b๋ณด๋ค ํฐ ํ์ ์๋ฅผ a์ ์์น์ ๋์ ํ์ฌ ๊ธฐ๋ก
๋ง์ฝ ์ด๋ฏธ ๋์ ๋ ๊ฐ์ด ํฌ๋ค๋ฉด ํด๋น ๊ด๊ณ๋ ๋ฌด์ํจ
๋ฐฐ์ด์ ์ต์ข
๊ฐ์ด ์ ์ผ(unique)ํ๋ค๋ฉด, ํด๋น ํ์์ ์์๋ฅผ ์ ์ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ๊ด๊ณ ํ์ธ ๋ถ๊ฐ ๋ฑ์ ์ด์ ๋ก ์ค์ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ถฉ๋ถํ์ง ์์๋ค.
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ(ํ๋ก์ด๋-์์
)
๋ฌธ์ ์ ํ์ด ํ๋ก์ด๋-์์
์ธ ๊ฒ์ ํ์ธํ ๋ค ํ์ด๋ณด์๋ค.
์ฒ์์ int[] ๋ฐฐ์ด๋ก ํ์ดํ๋ค๊ฐ ์์ ๋ณด๋ค ํฐ ์ฌ๋์ true๋ก ์ฒดํฌํ๋ boolean[] ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด์ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊ฟ ์ ์์๋ค.
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
boolean[][] H = new boolean[N][N];
for(int i=0; i < M; i++){
st = new StringTokenizer(br.readLine());
int u1 = Integer.parseInt(st.nextToken());
int u2 = Integer.parseInt(st.nextToken());
H[u1-1][u2-1] = true;
}
์๋์ ๊ฐ์ด ํ๋ก์ด๋-์์
์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ค.
k๋ฅผ ๊ธฐ์ค์ผ๋ก i ์ k ์ ๋์ ๊ด๊ณ(i์ ํค<j์ ํค)๊ฐ ์ ํด์ง๋ค๋ฉด H[i][j] = true๋ก ์ค์ ํ๋ค.
for(int k=0; k < H.length; k++) {
for (int i = 0; i < H.length; i++) {
if(i == k) continue;
for (int j = 0; j < H.length; j++) {
if(H[i][k] && H[k][j]) {
H[i][j] = true;
}
}
}
}
์์ ์ด ํค๊ฐ ๋ช ๋ฒ์งธ์ธ์ง ์ ์ ์๋ ํ์์ ์์ ๋ณด๋ค ๋ช๋ช
์ด ํฐ์ง, ์์ ๋ณด๋ค ๋ช๋ช
์ด ์์์ง ์ ํํ ์
์ ์๋ ํ์์ด๋ค.
N๋ช
์ ํ์์ด ์กด์ฌํ๋ค๋ฉด,i ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํ๋ฉด H[i][j](์์ ๋ณด๋ค ํฐ ํ์ ์) + H[j][i](์์ ๋ณด๋ค ์์ ํ์ ์) == N-1 ์ด ๋์ด์ผ ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํฌ ์ ์๋ค.
์ด๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
int answer = 0;
for(int i=0; i < H.length; i++){
int cnt=0;
for(int j=0; j < H.length; j++){
if(i==j) continue;
if(H[i][j] || H[j][i]){
cnt++;
}
}
if(cnt==N-1) answer++;
}
์ต์ข
์ ์ผ๋ก answer๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ๋ต์ด ๋๋ค.
์ด๋ ๊ฒ ๊ตฌํํ ์ฝ๋๋ ์๊ฐ์ด 530ms ์ ๋ ๋์๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ ์ถํ ์ฝ๋๋ค ์ค ์๊ฐ์ด ์งง์ ์ฝ๋๋ฅผ ์์ฃผ๋ก ์ดํด๋ณด๋ DFS๋ก ์ ๊ทผํ ํ์ด๊ฐ ๋ง์์ DFS๋ก ๋ค์ ๊ตฌํํด๋ณด์๋ค.
๋๋ฒ์งธ ๋ฐฉ๋ฒ(DFS, ๊น์ด์ฐ์ ํ์)
์ฐ์ DFS๋ฐฉ์์ ์ํํ๊ธฐ ์ํด ๋ฐฉ๋ฌธํ ํ์ ์ฒดํฌ๋ฅผ ์ํ boolean ๋ฐฐ์ด์ ์ถ๊ฐํด์ค๋ค.
H = new boolean[N][N];
visited = new boolean[N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
final int u1 = Integer.parseInt(st.nextToken());
final int u2 = Integer.parseInt(st.nextToken());
H[u1-1][u2-1] = true;
}
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํ์์ ๋ํด dfs๋ฅผ ํธ์ถํ๋ค. (๋ฐฉ๋ฌธ๋ ํ์ ์ ์ธ)
for (int i = 0; i < N; i++) {
if (visited[i])
continue;
dfs(i);
}
dfs๋ ์๋์ ๊ฐ์ด ๊ตฌํ๋๋ค. s๋ฅผ ์์ ํ์์ผ๋ก ๋๊ณ , H[s][i](i๊ฐ s๋ณด๋ค ํค๊ฐ ํผ)์ด true๋ผ๋ฉด i์ ๋ํด dfs๋ฅผ ๋ค์ ํธ์ถํ๋ค.
์ด๋ ๊ฒ s ๋ณด๋ค ํฐ ํ์์ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ์ฐพ์ ๋ค, H[s][j](s๋ณด๋ค ํฐ j)์ ์ง์ dfs(i) ํธ์ถ๋ก ์ป์ H[i][j](j๊ฐ i๋ณด๋ค ํผ)๋ฅผtrue์ผ ๊ฒฝ์ฐ ๊ฐฑ์ ํด์ค๋ค.
if(H[s][i]) // i ๊ฐ s๋ณด๋ค ํฐ ๊ฒฝ์ฐ (s < i)
dfs(i) // i์ ๋ํด i ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ์ํด ๋ค์ dfs ํธ์ถ => ๊ทธ๋ ๊ฒ ํธ์ถํด์ i ํ์ ๋ํ ๋ชจ๋ ์ ๋ณด ๊ฐฑ์ (๊ทธ๋ ๊ฒ iํ์ ๋์ ๋ true๋ ์ง์ ์ dfs(i)๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ H[s][i] ์ฆ sํ์ ๋ชจ๋ true๋ก ์ถ๊ฐ์์ผ์ผํจ.
H[s][j] = H[i][j]; // j๊ฐ i๋ณด๋ค ํฌ๋ค๋ฉด j๋ s๋ณด๋ค๋ ํฌ๊ธฐ ๋๋ฌธ
public static void dfs(final int s) {
if (visited[s])
return;
for (int i = 0; i < N; i++) {
if (H[s][i]) {
dfs(i);
for (int j = 0; j < N; j++) {
if(!H[s][j] && H[i][j]) {
H[s][j] = H[i][j];
}
}
}
}
visited[s] = true;
}
์ด๋ ๊ฒ ๋ชจ๋ ํ์์ ๋ํด dfs ํธ์ถ์ด ์๋ฃ ๋์๋ค๋ฉด ์์ ๋ณด๋ค ํฐ ํ์๋ค์ ๋ํด ๊ฐ ํ์์ true๋ค์ด ๋ชจ๋ ๊ฐฑ์ ๋ ์ํ์ด๋ค.
H[i][j] : i๋ณด๋ค j๊ฐ ํผ, H[j][i] : j๋ณด๋ค i๊ฐ ํผ => ์ด ๋์คํ๋๋ true ์ฌ์ผ ๋์๋น๊ต๊ฐ ๊ฐ๋ฅํจ
์ฐ๋ฆฌ๋ ์ ํํ ์์ ๋ณด๋ค ํฌ๊ฑฐ๋ ์์ ๊ฒ์ ์๋ ๊ฒ์ด ์ค์ํ๊ณ ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๊ฒ N-1์ธ์ง ์ฒดํฌํ๋ฉด ๋๋ค.
int answer = 0;
for (int i = 0; i < N; i++) {
int sum = 0;
for (int j = 0; j < N; j++) {
if(H[i][j] || H[j][i]) sum++;
}
if (sum == N - 1)
answer++;
}
ํ๋ก์ด๋์์
์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ ๋๋ณด๋ค dfs๋ก ์ ๊ทผํ์ ๋ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์๋๋ฐ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด๋ณด๋ฉด
๋ฐฉ๋ฒ 1 (ํ๋ก์ด๋-์์
)
- 3์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ
- ์ ์ฒด ์๊ฐ ๋ณต์ก๋: O(N^3), ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ํฌ์ํ๋๋ผ๋ O(N^3)๋ก ๊ณ ์
- ๊ทธ๋ํ์ ๋ฐ์ง๋(ํฌ์ํ๋ ฌ, ๋ฐ์งํ๋ ฌ)์ ์๊ด์์ด ๋ชจ๋ ๋ ธ๋ ์์ ๊ณ ๋ คํ๋ ํ๋ก์ด๋์์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ฑ
- ๊ณต๊ฐ ๋ณต์ก๋: O(N^2)
๋ฐฉ๋ฒ 2 (DFS)
- DFS๋ฅผ N๋ฒ ์ํํ ์ ์์ผ๋ฉฐ, ๊ฐ DFS์์ ์ต๋ N๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ
- ์ ์ฒด ์๊ฐ ๋ณต์ก๋: O(N * (N^2))
- ์ต์ : O(N^2)-H[s][i]๊ฐ ๋ชจ๋ false๋ผ๋ฉด N๋ฒ๋ง ์ํ
- ์ต์ : O(N^3)
- ๊ณต๊ฐ ๋ณต์ก๋: O(N^2) (์ธ์ ํ๋ ฌ) + O(N) (๋ฐฉ๋ฌธ ๋ฐฐ์ด)
์์ ์ด์ ๋๋ฌธ์ DFS ์ ๊ทผ๋ฒ์ด ์ด ๋ฌธ์ ์์ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ ๊ฒ ๊ฐ๋ค. ํ๊ท ์ ์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ DFS์ ์ ๋ฆฌํ์ง ์์์๊น ์๊ฐํด๋ณธ๋ค.
DFS ์ ๊ทผ๋ฒ์ N์ด ์๊ฑฐ๋ ๊ทธ๋ํ๊ฐ ํฌ์ํ ๊ฒฝ์ฐ์๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ง๋ง, N์ด ์ปค์ง๊ฑฐ๋ ๊ทธ๋ํ๊ฐ ๋ฐ์ง๋์์ ๊ฒฝ์ฐ DFS ํธ์ถ๋ง๋ค ๋
ธ๋๋ฅผ ํ์ํ๊ณ ๊ด๊ณ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
๋ฐ๋ฉด, ํ๋ก์ด๋์์
์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ ์ค๋ณต ์ฐ์ฐ ์์ด ๋ชจ๋ ๋
ธ๋ ์์ ์ผ์ ํ๊ฒ ํ ๋ฒ์ฉ๋ง ํ์ธํ๋ฏ๋ก ๊ณผ๋ํ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ์ ๋ค.
๋๋์ :
dfs๋ก ํ์ด๋ณด๋ฉด์ ๋๋ ๊ฒ์ด ์๋๋ฐ, ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๋ด๊ฐ ์ง์ ์ธ์ ํ๋ ฌ์ ์์ผ๋ก ๊ทธ๋ ค๋ณด๊ณ ํ์์ ๋, DFS์ ๋ฐฉ๋ฒ์ผ๋ก ํ๊ณ ์์๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ ์ ์ฝ๋๋ก ๊ตฌํํ ๋๋ ์ ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๋ค. ๋ด๊ฐ ์์ผ๋ก ํ์์ ๋(๋ณธ๋ฅ์ ์ธ?)ํ์ด๋ฅผ ์ ์ผ์นํ์ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ์ ํ ๋ณํํ๋ ๊ฐ๊ฐ์ ํค์์ผ๋ ๊ฑฐ ๊ฐ๋ค.
๋ ํ๋ก์ด๋์์
์๊ณ ๋ฆฌ์ฆ์ 6์ผ์ ์ ์ฒ์ ์ ํ์ ๋ ๋ญ๊ฐ ์ ๋งคํ๊ฒ ์ดํด๊ฐ ๋์ง ์์ ๋ต๋ตํ๋๋ฐ, ์ง๋ 6์ผ๋์ ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๊ณต๋ถํ๊ณ ๊ด๋ จ๋ ๋ฌธ์ 3,4๊ฐ์ ๋๋ฅผ ๊ธธ๊ฒ ๊ณ ๋ฏผํด๋ณด๋ ์ ์ ๋์ ๊ฒ์ด ๋๋๋ฏํ ๋๋์ด ๋ค๊ณ ์๋ค. ํ๋ฃจ ํ๋ฌธ์ ๋ง ํ์ด๋ ๊น๊ฒ ๊ณ ๋ฏผ์ ํด๋ณด๋ ๊ฒ์ด ๋ ๋์๋๋๊ฑฐ ๊ฐ์ ์ฝํ
์ ์์ ๊ฐ์ด ์๊ธธ ๋๊น์ง ๊พธ์คํ ๋งค์ผ ํ๋ฌธ์ ์ฉ ๊น๊ฒ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค.
'๋ฌธ์ ํด๊ฒฐ (PS) > ์ฝํ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ํธ๋ฆฌ, ๊ตฌํ | ํ๋ก๊ทธ๋๋จธ์ค ๋ค๋จ๊ณ ์นซ์ ํ๋งค (0) | 2024.11.06 |
---|---|
[Java] ๋๋น ์ฐ์ ํ์ BFS| ๋ฐฑ์ค 1240 ๋ ธ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ (0) | 2024.11.04 |
[Java] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ | ๋ฐฑ์ค 2457 ๊ณต์ฃผ๋์ ์ ์ (0) | 2024.11.02 |
[Java] ๋ฒจ๋ง-ํฌ๋ | ๋ฐฑ์ค 1865 ์ํ (0) | 2024.11.01 |
[Java] ํ๋ก์ด๋โ์์ | ๋ฐฑ์ค 2660 ํ์ฅ๋ฝ๊ธฐ (0) | 2024.10.31 |