Coding Test/Baekjoon
백준 17204번 죽음의 게임 (JAVA)
good_da22
2022. 9. 21. 00:38
백준 17204번 죽음의 게임 (JAVA)
난이도
- 실버 3
알고리즘 분류
- 구현
- 그래프 이론
- 그래프 탐색
- 시뮬레이션
풀이
출발번호(0) 부터 목표번호(K)로 가는 최솟값 구하기
어떤 방법으로도 K로 갈 수 없는 경우는 K에 도착하기 전에 사이클이 발생한다.
코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(in.readLine());
int N = Integer.parseInt(st.nextToken()); // 참가자 수
int K = Integer.parseInt(st.nextToken()); // 보성이 번호
int target[] = new int[N];
for (int i = 0; i < N; i++) {
target[i] = Integer.parseInt(in.readLine());
}
Set<Integer> game = new HashSet<Integer>(); // 중복을 피하기 위한 자료구조 Set 사용
int size = 0; // Set의 크기
int answer = -1; // 정답
int start = 0; // 시작은 항상 0
int cnt = 0; // 게임이 진행되는 횟수
while(true) {
size = game.size(); // Set의 크기 구하기
cnt++; // 게임 1회 진행
int next = target[start]; // 현재 사람이 지목한 다음 사람
if(next == K) { // 다음 사람이 K인 경우
answer = cnt; // 정답은 현재까지 진행한 횟수
break; // 반복 종료
}
start = next; // 다음 게임의 시작은 현재 사람이 지목한 사람
game.add(next); // 지목한 사람을 Set에 추가
if(size == game.size()) { // Set의 크기 변화가 없는 경우, 한 번 지목당한 사람이 다시 지명되었다. 즉, 사이클이 발생한다.
break; // 반복 종료, 도달할 수 없기 때문에 정답은 -1
}
}
sb.append(answer);
out.write(sb.toString());
out.close();
}
}