[백준] 17827번 - 달팽이 리스트 by Python(파이썬)

윤소영·2023년 7월 17일
0

백준

목록 보기
13/13

✨ 문제

문제 링크 → 백준 17827번 - 달팽이 리스트

✨ 핵심

  • 문제 자체는 단순한 편 → 시간 초과 조심하기
  • 인덱스 범위 초과만 조심하면 됨

✨ 풀이

import sys
input = sys.stdin.readline
output = sys.stdout.write

N, M, V = map(int, input().split())
node_list = input().split()
for i in range(M):
    K = int(input())
    if K >= N:
        output(node_list[(V-1)+int((K-(V-1))%(N-(V-1)))]+"\n") 
    else:
        output(node_list[K]+"\n")
  • 반복문에서 K(몇 번 이동했는지에 대한 수) 입력 받으면 K가 리스트 인덱스 범위인 0~(N-1)에 포함되지 않는지 포함되는지 if, else 문으로 구분해 케이스를 나눠 계산했다.
    • 범위 안에 있으면 그냥 K 인덱스에 해당하는 숫자 출력하면 된다.
    • 범위 밖에 있으면 인덱스를 범위 안에 들어오도록 계산해 출력하면 된다.
      → (V-1) = 달팽이 리스트에서 사이클에 포함되지 않는 노드의 수
      → (K-(V-1))%(N-(V-1)) = K에서 V-1을 빼주면 이제 달팽이 리스트에서 사이클에 포함되지 않는 노드들을 신경쓸 필요가 없다. 그 값을 "N-(V-1) = 사이클에 포함되는 노드들의 수"로 나눠 나머지를 구하면, 그 나머지는 사이클에서 V번 노드에서 몇 번 이동한 것인지를 나타내는 수가 된다.
      → 위 2개를 더해 최종적으로 범위 안의 인덱스로 변환한다.
  • 입력, 출력은 저번에 다른 문제 풀 때 시간 초과 해결하려고 찾아본 내용을 이번에 그대로 써봤다.

✨ 결과

👩🏻‍💻 후기

맨 처음에는 while문을 써봤는데 역시나 시간 초과..가 발생해 그냥 반복문을 없앨 수 있게 계산식으로 바꿔서 작성했다. 제출하고 가장 뿌듯한 건 pypy3로 제출한 사람들 중에 제일 시간이 적게 걸렸다는 것!!! 아마 문제 제출해서 맞은 사람들 중에 시간 제일 적게 걸린 경우는 처음인 것 같다. 뿌듯하니까 밑에 남겨놔야지 🥳
이제 1,2학년 때 풀다가 포기했던 문제들을 거의 다 풀고 1~2문제 정도 남은 것 같다. 남은 문제들 다 풀면 유형별로 풀어보기도 하고 다른 사이트 문제도 풀어봐야겠다.

profile
Major in IT Engineering(2021.03~)

0개의 댓글