
-Code
import java.io.*;
import java.util.ArrayList;
public class BOJ2668 {
static int numCnt;
static int[] nums;
static boolean[] visited;
static ArrayList<Integer> answer = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
numCnt = Integer.parseInt(br.readLine());
// 숫자 받기
nums = new int[numCnt + 1];
for (int i = 1; i <= numCnt; i++) {
nums[i] = Integer.parseInt(br.readLine());
}
// 상태를 저장할 리스트 셋팅
for (int i = 1; i <= numCnt; i++) {
// 자기 자신으로 돌아올 수 있는지 확인
visited = new boolean[numCnt + 1];
numSelect(i, i);
}
// 출력
StringBuilder sb = new StringBuilder();
sb.append(answer.size()).append("\n");
for (int num : answer) {
sb.append(num).append("\n");
}
System.out.println(sb);
br.readLine();
}
private static void numSelect(int now, int target) {
visited[now] = true;
int next = nums[now];
// 다음이 처음 시작점인 target이면 추가
if (next == target) {
answer.add(target);
}
// target이 아니지만 방문하지 않으면 DFS
if (!visited[next]) {
numSelect(next, target);
}
}
}
집합이라길래 무슨 문제인지 이해를 못 해서 찾아보니 그냥 시작점으로 돌아올 수 있는 경우를 세주는 문제였습니다. 이를 알게 되고 해결을 하였습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 2615번 오목 (0) | 2026.02.11 |
|---|---|
| [백준/Java] 16337번 Die (0) | 2026.02.11 |
| [프로그래머스/Java] 햄버거 만들기 (0) | 2026.02.10 |
| [백준/Java] 5052번 전화번호 목록 (0) | 2026.02.10 |
| [백준/Java] 12981번 공 포장하기 (0) | 2026.02.10 |