차곡차곡

[BOJ/Python] 백준 17827번 - 달팽이 리스트 본문

CS/Algorithm

[BOJ/Python] 백준 17827번 - 달팽이 리스트

sohy 2022. 5. 19. 18:22

백준 #17827 달팽이 리스트

 

17827번: 달팽이 리스트

첫째 줄에 노드의 개수 N(2 ≤ N ≤ 200,000), 질문의 횟수 M(1 ≤ M ≤ 200,000), N번 노드가 가리키는 노드의 번호 V(2 ≤ V ≤ N)가 공백으로 구분되어 주어진다. 둘째 줄에 N개의 정수 C1, C2, …, CN이 공백

www.acmicpc.net

import sys
input = sys.stdin.readline

n, m, v = map(int, input().split())   # n: 노드 개수, m: 질문 횟수, v: 노드 n이 가리키는 노 번호
l = list(map(int, input().split()))   # 노드 정수

for _ in range(m):
    k = int(input())   # 이동하려는 노드 칸 수
    if k - 1 < n - 1:
        print(l[k])
    else:
        left = k - n   # v로 돌아옴
        left = left % (n - v + 1)
        print(l[v-1+left])
  1. 이동하려는 노드 칸 수가 리스트 범위를 벗어날 경우, 처음 리스트 크기만큼 이동하고 그 다음부터는 사이클을 반복해서 돌게 된다.
  2. 처음 리스트 크기만큼 이동해서 사이클이 시작되는 노드로 오는 데 n-k칸을 이동하게 된다. 이동하려는 칸(k)에서 해당 칸(n-k)을 빼서 남은 이동해야 하는 칸 수를 구한다.
  3. 사이클이 시작되는 노드에서 출발해서 다시 해당 노드로 돌아오는 데 몇 번 이동하게 되는지 구한다. 남은 이동 칸 수에서 해당 값을 나눴을 때 몫이 사이클을 도는 횟수가 되고, 나머지가 사이클을 돌고 사이클 속에서 이동하게 되는 남은 칸 수가 된다.

Comments