[백준] 죽음의 게임
2025. 3. 16. 20:45ㆍ코딩테스트
문제보기 - https://www.acmicpc.net/problem/17204
문제명 - 순열 사이클
난이도 - S3
문제유형 - 그래프이론
풀이일자 - 25.03.16
📌 문제 탐색하기
- N명의 학생이 원형으로 앉아있고 0번 학생부터 시작하여 각 학생이 가리키는 다음 학생 번호에 따라 정해짐
- 1 ≤ N ≤ 100 (학생 수)
- 특정 번호(K) 학생에게 도달하면 게임이 끝남
- 0 ≤ K < N (목표 학생 번호)
- K번 학생에게 도달하기 위한 최소 이동 횟수를 구하는 문제
🛠 시간복잡도 확인
- 각 학생이 하나의 노드, 이동이 간선이 되는 단방향 그래프 탐색 문제임
- 최대 학생 수가 100명이므로 BFS(너비 우선 탐색) 가능! -> O(N)
📌 코드 설계하기
- BFS를 사용하여 최소 이동 횟수 계산 함수 생성하기(import deque)
- visited 리스트로 방문 여부 체크
- visited = [False] * N
- queue를 사용하여 0번 학생부터 탐색
- queue = deque([(0, 0)])
- count를 증가시키면서 K번 학생에 도달하면 정답 반환
- visited 리스트로 방문 여부 체크
- N,K 입력값을 받기
- K번 학생을 찾으면 결과 출력하고 찾지 못한 경우 -1 출력하기
📌 정답 코드(1회차)
import sys
from collections import deque
# 1. BFS를 사용하여 최소 이동 횟수 계산 함수 생성하기
def death_game(N, K, moves):
visited = [False] * N
queue = deque([(0, 0)]) # (현재 학생 번호, 이동 횟수)
visited[0] = True
while queue:
current, count = queue.popleft()
if current == K: # 현재 학생이 K번 학생이면 이동 횟수 반환
return count
next_student = moves[current]
if not visited[next_student]:
visited[next_student] = True
queue.append((next_student, count + 1))
return -1 # K번 학생을 찾지 못한 경우
# 2. N,K 입력값을 받기
N, K = map(int, sys.stdin.readline().split())
moves = [int(sys.stdin.readline().strip()) for _ in range(N)]
# 3. 결과 출력
print(death_game(N, K, moves))
'코딩테스트' 카테고리의 다른 글
[백준] 도비의 난독증 테스트 (0) | 2025.03.19 |
---|---|
[백준] 촌수계산 (0) | 2025.03.18 |
[백준] 순열 사이클 (0) | 2025.03.15 |
[백준] 1로 만들기 (0) | 2025.03.14 |
[백준] 다리 놓기 (0) | 2025.03.13 |