현제의 현재이야기

[백준/python] 17827 - 달팽이리스트 본문

algorithm

[백준/python] 17827 - 달팽이리스트

현재의 현제 2022. 6. 25. 15:27

import sys
from collections import deque
input = sys.stdin.readline

n, m, v = map(int, input().split()) # n: 노드개수 m: 질문 횟수 v: 가르키는 노드
a = list(map(int, input().split()))
cut_a = a[:]
cut_a = deque(cut_a)
result = []

for _ in range(v - 1):
    cut_a.popleft()

for _ in range(m):
    question = int(input())
    if question < n:
        result.append(a[question])
    else:
        question -= v - 1
        question = question % len(cut_a)
        result.append(cut_a[question])

for answer in result:
    print(answer)

| 알고리즘

 

  1. 저장 된 값 a를 받고 cut_a에 복사
  2. cut_a에는 순환하는, 즉 달팽이의 껍질 부분만을 담을 거임
  3. 따라서 순환되지 않은 부분을 없애기 위해 popleft를 v - 1번 시행해줌. # v - 1 번인 이유는 v번째 부터 껍질이 시작하기 때문에
  4. 만약에 들어오는 질문이 n보다 작으면 기존의 a에서 저장된 값을 result에 저장
  5. 만약에 들어노는 질문이 n보다 크면 질문에 v - 1를 해줌 #달팽이의 몸통부분을 잘라준다
  6. 그리고 잘린 질문을 % cut_a를 해줌으로써 cut_a를 넘지 않게 함

예:

A = [13 2 5 11 7 8 2 4 9 10] v = 3 cut _ a = [5, 11, 7, 8, 2, 4, 9, 10]

question = 10이 들어오면 노드 개수 10보다 크거나 같음으로 else로 들어가서

10 – (3 – 1) = 8 8 = 8 % 8 = 0 Cut_a[0]참조해서 5이다.

Comments