[λ°±μ€€/python] 1021번 : νšŒμ „ν•˜λŠ” 큐

2021. 3. 12. 00:21

문제

μ§€λ―Όμ΄λŠ” N개의 μ›μ†Œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” μ–‘λ°©ν–₯ μˆœν™˜ 큐λ₯Ό 가지고 μžˆλ‹€. μ§€λ―Όμ΄λŠ” 이 νμ—μ„œ λͺ‡ 개의 μ›μ†Œλ₯Ό 뽑아내렀고 ν•œλ‹€.

μ§€λ―Όμ΄λŠ” 이 νμ—μ„œ λ‹€μŒκ³Ό 같은 3가지 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

  1. 첫 번째 μ›μ†Œλ₯Ό 뽑아낸닀. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, μ›λž˜ 큐의 μ›μ†Œκ°€ a1, ..., akμ΄μ—ˆλ˜ 것이 a2, ..., ak와 같이 λœλ‹€.
  2. μ™Όμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™μ‹œν‚¨λ‹€. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, a1, ..., akκ°€ a2, ..., ak, a1이 λœλ‹€.
  3. 였λ₯Έμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™μ‹œν‚¨λ‹€. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, a1, ..., akκ°€ ak, a1, ..., ak-1이 λœλ‹€.

큐에 μ²˜μŒμ— ν¬ν•¨λ˜μ–΄ 있던 수 N이 주어진닀. 그리고 지민이가 뽑아내렀고 ν•˜λŠ” μ›μ†Œμ˜ μœ„μΉ˜κ°€ 주어진닀. (이 μœ„μΉ˜λŠ” κ°€μž₯ 처음 νμ—μ„œμ˜ μœ„μΉ˜μ΄λ‹€.) μ΄λ•Œ, κ·Έ μ›μ†Œλ₯Ό 주어진 μˆœμ„œλŒ€λ‘œ λ½‘μ•„λ‚΄λŠ”λ° λ“œλŠ” 2번, 3번 μ—°μ‚°μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 큐의 크기 Nκ³Ό 뽑아내렀고 ν•˜λŠ” 수의 개수 M이 주어진닀. N은 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , M은 N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 지민이가 뽑아내렀고 ν•˜λŠ” 수의 μœ„μΉ˜κ°€ μˆœμ„œλŒ€λ‘œ 주어진닀. μœ„μΉ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 문제의 정닡을 좜λ ₯ν•œλ‹€.

 

μ •λ‹΅

from collections import deque
N, M = map(int, input().split())
number = list(map(int, input().split()))
answer = 0

deq = deque()
for i in range(1, N + 1):
    deq.append(i)

for n in number:
    idx = deq.index(n)
    if idx == 0:
        deq.popleft()
    else:
        if idx < len(deq) - idx:
            answer += idx
            deq.rotate(-idx)
            deq.popleft()
        else:
            answer += len(deq) - idx
            deq.rotate(len(deq) - idx)
            deq.popleft()

print(answer)

dequeλ₯Ό ν™œμš©ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

 

deq = deque()
for i in range(1, N + 1):
    deq.append(i)

deq에 1λΆ€ν„° NκΉŒμ§€μ˜ 숫자λ₯Ό μ €μž₯ν•œλ‹€.

for n in number:
    idx = deq.index(n)
    if idx == 0:
        deq.popleft()
    else:
        if idx < len(deq) - idx:
            answer += idx
            deq.rotate(-idx)
            deq.popleft()
        else:
            answer += len(deq) - idx
            deq.rotate(len(deq) - idx)
            deq.popleft()

μ°ΎμœΌλ €λŠ” 숫자의 인덱슀λ₯Ό idx에 μ €μž₯ν•˜κ³ 

μ°ΎμœΌλ €λŠ” μˆ«μžκ°€ deq의 맨 μ•žμ— 있으면(idx==0) 이동할 ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ deqμ—μ„œ κΊΌλ‚΄μ€€λ‹€.

μ°ΎμœΌλ €λŠ” 숫자둜 μ΄λ™ν•˜κΈ°κΉŒμ§€ μ•žμ—μ„œ μ΄λ™ν•˜λŠ”κ²Œ λΉ λ₯Έμ§€(idx), λ’€μ—μ„œ μ΄λ™ν•˜λŠ”κ²Œ λΉ λ₯Έμ§€(len(deq)-idx)

λΉ„κ΅ν•œ ν›„ 더 λΉ λ₯Έμͺ½μœΌλ‘œ deqλ₯Ό rotateν•œλ‹€.

rotateν•œ 정도가 μ΄λ™ν•œ μ •λ„μ΄λ―€λ‘œ answer에 μ €μž₯ν•˜κ³  λ§¨μ•žμ— n이 μ™€μžˆμœΌλ―€λ‘œ deqμ—μ„œ κΊΌλ‚΄μ€€λ‹€.

 

popleft(), rotate() λ“± deque의 μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜μ˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜λ©΄ λœλ‹€.

2021.03.19 - [πŸ”μ•Œκ³ λ¦¬μ¦˜/πŸ”…κ°œλ…μ •λ¦¬] - [파이썬/python] 큐 (Queue)

 

[파이썬/python] 큐 (Queue)

큐(Queue)λŠ” μŠ€νƒ(Stack)κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ λ°˜λŒ€μ˜ 성격을 μ§€λ‹Œλ‹€. μŠ€νƒμ€ LIFO(Last In First Out)의 ν˜•νƒœλ‘œ λ§ˆμ§€λ§‰μ— λ“€μ–΄κ°„ 데이터가 첫 번째둜 λ‚˜μ˜€λŠ” ꡬ쑰이고 νλŠ” FIFO(First In First Out)의 ν˜•νƒœλ‘œ 첫 번째..

ye333.tistory.com

 

728x90

BELATED ARTICLES

more