๋ฐ์ํ
๋งํฌ
https://www.acmicpc.net/problem/13023
๋ฌธ์ ์์ฝ
0๋ฒ~N-1๋ฒ ์ฌ๋ ์ค ์๋์ ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ฌ๋ A, B, C, D, E๊ฐ ์กด์ฌํ๋์ง ๊ตฌํ๊ธฐ
- A๋ B์ ์น๊ตฌ๋ค.
- B๋ C์ ์น๊ตฌ๋ค.
- C๋ D์ ์น๊ตฌ๋ค.
- D๋ E์ ์น๊ตฌ๋ค.
์ ํ
- ์ฒซ์งธ ์ค์ ์ฌ๋์ ์ N, ์น๊ตฌ ๊ด๊ณ์ ์ M
- 5 ≤ N ≤ 2000
- 1 ≤ M ≤ 2000
- ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ์ ์ a์ b๊ฐ ์ฃผ์ด์ง๋ฉฐ, a์ b๊ฐ ์น๊ตฌ๋ผ๋ ๋ป์ด๋ค.
- 0 ≤ a, b ≤ N-1, a ≠ b
- ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๊ฐ ๋ ๋ฒ ์ด์ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ X
- ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง๋ A, B, C, D, E๊ฐ ์กด์ฌํ๋ฉด 1์ ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
ํ์ด
๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด์ผํ๋ ๋ฌธ์ ๋ก, DFS๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ํด dfs๋ฅผ ์ํํ๋ค.
- ์์์ ์ `cnt`(์น๊ตฌ ์) ๊ฐ์ด 1์ด๋ค.
- dfs๋ ์์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ์น๊ตฌ ๊ด๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ dfs ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ค.
- ์ฌ๊ท ํธ์ถํ ๋ `cnt`(์น๊ตฌ ์) ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
- ํธ์ถํ๊ธฐ ์ , ํด๋น ์ ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ํ๋ค.(๊ฒน์น์ง ์๋ A, B, C, D, E๋ฅผ ์ฐพ๊ธฐ ์ํด)
- ์ฌ๊ท ํธ์ถ์ด ๋๋ ์์ ์๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ค์ `false`๋ก ํ์ํ๋ค.
- 0,1,2,3 ๊น์ง ์๋ํ๋๋ฐ ์คํจํ๋ค๋ฉด ๋ค์์ผ๋ก 0,1,2,4 ์ด๋ฐ ์์ผ๋ก ์๋ํ๊ธฐ ์ํจ์ด๋ค.
- ๋ง์ฝ `cnt` ๊ฐ์ด 5๊ฐ ๋๋ฉด, ์กฐ๊ฑด์ ๋ง๋ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๋ฐ๊ฒฌํ์์ ํ์ํ๊ณ ํ์์ ์ข ๋ฃํ๋ค.
- ๋ง์ฝ ์์ง ์ํ๋ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ๋ค๋ฅธ ์์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก 2 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static boolean findFlag;
static ArrayList<Integer>[] edges;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
edges = new ArrayList[N];
visited = new boolean[N];
for(int i=0; i<N; i++){
edges[i] = new ArrayList<>();
}
for(int i=0; i<M; i++){
st = new StringTokenizer(br.readLine());
int first = Integer.parseInt(st.nextToken());
int second = Integer.parseInt(st.nextToken());
edges[first].add(second);
edges[second].add(first);
}
for(int i=0; i<N; i++){
if(!findFlag){ // ์์ง ์กฐ๊ฑด์ ๋ง๋ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฐพ์ง ๋ชป ํ์ผ๋ฉด ํ์
dfs(i,1);
}
}
System.out.println(findFlag ? 1 : 0);
}
static void dfs(int start, int cnt) {
if(cnt == 5){ // ์กฐ๊ฑด์ ๋ง๋ ์น๊ตฌ 5๋ช
์ ์ฐพ์ผ๋ฉด ๋
findFlag = true;
return;
}
visited[start] = true;
for(int next: edges[start]){
if(!visited[next]){
dfs(next, cnt+1);
}
}
visited[start]=false;
}
}
๐ท ์๊ฐ ๋ณต์ก๋
- `N`: ์ ์ ์ ์
- `M`: ๊ฐ์ ์ ์
- DFS๋ ๊ฐ ์ ์ ์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ , ๊ฐ ๊ฐ์ ์ ํ ๋ฒ์ฉ ํ์ํ๋ฏ๋ก `O(N + M)`
- ์ต์ข ์๊ฐ ๋ณต์ก๋: `O(N + M)`
๐ท ์คํ ์๋
Time: 232 ms, Memory: 21980 KB
๋ฐ์ํ
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/๋ฐฑ์ค] 2597 ๊ณ๋จ ์ค๋ฅด๊ธฐ(JAVA) (2) | 2025.02.14 |
---|---|
[BOJ/๋ฐฑ์ค] 1010 ๋ค๋ฆฌ ๋๊ธฐ (JAVA) (1) | 2025.02.13 |
[BOJ/๋ฐฑ์ค] 2178 ๋ฏธ๋ก ํ์(JAVA) (1) | 2025.02.11 |
[BOJ/๋ฐฑ์ค] 1931 ํ์์ค ๋ฐฐ์ (JAVA) (1) | 2025.02.10 |