[ BOJ / Python ] 17204번 죽음의 게임

황승환·2022년 2월 12일
0

Python

목록 보기
177/498


이번 문제는 그래프를 탐색하여 해결하는 문제이다. 그래프는 인접 리스트 형태로 저장하였다. 그리고 방문처리 리스트를 사용하여 한 사람이 두 번 이상 말하지 않도록 하였다. 데크를 사용하여 while문의 반복 횟수를 조절하였다.

  • n, m을 입력받는다.
  • 그래프 리스트 finger를 2차원 리스트로 선언한다.
  • 카운팅 변수 cnt를 0으로 선언한다.
  • 정답을 저장할 변수 answer를 -1로 선언한다.
  • n번 반복하는 i에 대한 for문을 돌린다.
    -> a를 입력받는다.
    -> finger[i]에 a를 넣는다.
  • 방문처리 리스트 visited를 False n개로 채운다.
  • q를 데크로 선언한다.
  • q에 0을 넣는다. (시작하는 사람의 번호)
  • q가 존재하는 동안 반복하는 while문을 돌린다.
    -> q를 추출하여 cur로 저장한다.
    -> 만약 cur이 m일 경우, answer를 cnt로 갱신하고 반복문을 종료한다.
    -> visited[cur]를 True로 갱신한다.
    -> finger[cur]을 순회하는 nxt에 대한 for문을 돌린다.
    --> 만약 visited[nxt]가 False일 경우,
    ---> q에 nxt를 넣는다.
    ---> cnt를 1 증가시킨다.
  • answer를 출력한다.

Code

import collections
n, m=map(int, input().split())
finger=[[] for _ in range(n)]
cnt=0
answer=-1
for i in range(n):
    a=int(input())
    finger[i].append(a)
visited=[False for _ in range(n)]
q=collections.deque()
q.append(0)
while q:
    cur=q.popleft()
    if cur==m:
        answer=cnt
        break
    visited[cur]=True
    for nxt in finger[cur]:
        if not visited[nxt]:
            q.append(nxt)
            cnt+=1
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글