[BOJ][๋ฐฑ์ค][JAVA] 2668 - ์ซ์๊ณ ๋ฅด๊ธฐ
๐ฉ๐ป ๋ฌธ์ ํ๋ฌ ๊ฐ๊ธฐ
2668๋ฒ: ์ซ์๊ณ ๋ฅด๊ธฐ
์ธ๋ก ๋ ์ค, ๊ฐ๋ก๋ก N๊ฐ์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ง ํ๊ฐ ์๋ค. ์ฒซ์งธ ์ค์ ๊ฐ ์นธ์๋ ์ ์ 1, 2, …, N์ด ์ฐจ๋ก๋๋ก ๋ค์ด ์๊ณ ๋์งธ ์ค์ ๊ฐ ์นธ์๋ 1์ด์ N์ดํ์ธ ์ ์๊ฐ ๋ค์ด ์๋ค. ์ฒซ์งธ ์ค์์ ์ซ์๋ฅผ ์ ์
www.acmicpc.net
๐ฉ๐ป ๋ฌธ์
์ธ๋ก ๋ ์ค, ๊ฐ๋ก๋ก N๊ฐ์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ง ํ๊ฐ ์๋ค. ์ฒซ์งธ ์ค์ ๊ฐ ์นธ์๋ ์ ์ 1, 2, …, N์ด ์ฐจ๋ก๋๋ก ๋ค์ด ์๊ณ ๋์งธ ์ค์ ๊ฐ ์นธ์๋ 1 ์ด์ N์ดํ์ธ ์ ์๊ฐ ๋ค์ด ์๋ค. ์ฒซ์งธ ์ค์์ ์ซ์๋ฅผ ์ ์ ํ ๋ฝ์ผ๋ฉด, ๊ทธ ๋ฝํ ์ ์๋ค์ด ์ด๋ฃจ๋ ์งํฉ๊ณผ, ๋ฝํ ์ ์๋ค์ ๋ฐ๋ก ๋ฐ์ ๋์งธ ์ค์ ๋ค์ด์๋ ์ ์๋ค์ด ์ด๋ฃจ๋ ์งํฉ์ด ์ผ์นํ๋ค. ์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋๋ก ์ ์๋ค์ ๋ฝ๋, ์ต๋๋ก ๋ง์ด ๋ฝ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋ฅผ ๋ค์ด, N=7์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ํ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ์.
์ด ๊ฒฝ์ฐ์๋ ์ฒซ์งธ ์ค์์ 1, 3, 5๋ฅผ ๋ฝ๋ ๊ฒ์ด ๋ต์ด๋ค. ์ฒซ์งธ ์ค์ 1, 3, 5 ๋ฐ์๋ ๊ฐ๊ฐ 3, 1, 5๊ฐ ์์ผ๋ฉฐ ๋ ์งํฉ์ ์ผ์นํ๋ค. ์ด๋ ์งํฉ์ ํฌ๊ธฐ๋ 3์ด๋ค. ๋ง์ฝ ์ฒซ์งธ ์ค์์ 1๊ณผ 3์ ๋ฝ์ผ๋ฉด, ์ด๋ค ๋ฐ๋ก ๋ฐ์๋ ์ ์ 3๊ณผ 1์ด ์์ผ๋ฏ๋ก ๋ ์งํฉ์ด ์ผ์นํ๋ค. ๊ทธ๋ฌ๋, ์ด ๊ฒฝ์ฐ์ ๋ฝํ ์ ์์ ๊ฐ์๋ ์ต๋๊ฐ ์๋๋ฏ๋ก ๋ต์ด ๋ ์ ์๋ค.
๐ฉ๐ป ํด๊ฒฐ ๋ฐฉ๋ฒ
DFS๋ฅผ ๋๋ฆฌ๋ฉด์ ์ฌ๊ท๋ก ํ๋์ฉ ํ์ธํด๊ฐ๋ฉฐ visit๋ฅผ ์ฒดํฌํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์๋ค. ์๋ฅผ ๋ค์ด, dfs(1,1)์ ๋ฃ๊ณ ์์ํ๋ฉด ์์ ์์๋ก (3,1) ์ด ํ์ธ๋๊ณ 3์ ๋ค์ด์๋ ๊ฐ์ด 1์ด๊ธฐ ๋๋ฌธ์ ๋ค์ (1,1)์ด ๋๋ฉด ๋์ ๋ฐฐ์ด์ ๊ฐ์ ๋ด๊ณ ๋ค์ (2,2)๋ก ๋์ด๊ฐ๋ฉฐ ํ์ธํ๋ ํ์์ด๋ค.
๐ฉ๐ป ์์ค์ฝ๋
package BOJ.bfs_dfs;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class boj2668_์ซ์๊ณ ๋ฅด๊ธฐ {
static int N;
static int[] arr;
static boolean[] visit;
static ArrayList<Integer> result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N + 1];
visit = new boolean[N + 1];
result = new ArrayList<>();
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
for (int j = 1; j <= N; j++) {
visit[j] = true;
dfs(j, j);
visit[j] = false;
}
System.out.println(result.size());
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
static void dfs(int value, int i) {
if (visit[arr[value]] == false) {
visit[arr[value]] = true;
dfs(arr[value], i);
visit[arr[value]] = false;
}
if (arr[value] == i) {
result.add(arr[value]);
}
}
}
๐ฉ๐ป ๋ฆฌ๋ทฐ
์กฐํฉ ๋ฌธ์ ๋ฅผ ๋ง์ด ํ๋ค ๋ณด๋ ๋ณด์๋ง์ ๊ฐ์ก๊ณ ๋ฌธ์ ๋ฅผ ํ์๋ ๊ฒ ๊ฐ๋ค๐๐๐