관리 메뉴

πŸ’»πŸ’­πŸŽ§πŸŒ

BOJ 1021 : νšŒμ „ν•˜λŠ” 큐 (Python) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

BOJ 1021 : νšŒμ „ν•˜λŠ” 큐 (Python)

adorableco 2023. 9. 21. 14:19
λ°˜μ‘ν˜•

문제

https://www.acmicpc.net/problem/1021

 

1021번: νšŒμ „ν•˜λŠ” 큐

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

www.acmicpc.net

 

 

μ½”λ“œ

from collections import deque

n, m = map(int, input().split(' '))

array = list(map(int, input().split(' ')))

numlist = deque((i+1) for i in range(n))

result = 0
idx = 0

for i in range(m):
    for j in range(n):
        if array[i] == numlist[j]:
            idx = j
            break
    if idx == 0:
        numlist.popleft()
    elif idx == n-1:
        x = numlist.pop()
        numlist.appendleft(x)
        numlist.popleft()
        result += 1
    elif idx <= (n//2):
        for j in range(idx):
            result += 1
            temp = numlist.popleft()
            numlist.append(temp)
        numlist.popleft()
    else:
        for j in range(n-idx):
            result += 1
            temp = numlist.pop()
            numlist.appendleft(temp)
        numlist.popleft()
    n -= 1

print(result)

 

 

풀이

 

덱을 μ΄μš©ν•΄ ν’€μ—ˆλ‹€.

μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 전체 μ›μ†Œ κ°œμˆ˜μ—μ„œ μ€‘μ•™μ΄λ‚˜ μ€‘μ•™μ—μ„œ μ™Όμͺ½μ— μœ„μΉ˜ν•  κ²½μš°μ—λŠ” μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 인덱슀 0 μžλ¦¬μ— 올 λ•ŒκΉŒμ§€ deque λͺ¨λ“ˆμ˜ popleft() λ₯Ό μ‹€ν–‰ν•œλ‹€. μ‹€ν–‰ νšŸμˆ˜λŠ” idx λ²ˆμ΄λ‹€. (μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ 횟수λ₯Ό μ²΄ν¬ν•΄μ•Όν•˜λ―€λ‘œ result 값에 1을 더해쀀닀.) 그리고 κ³§λ°”λ‘œ appendleft() ν•¨μˆ˜λ‘œ κ·Έ 값을 λ‹€μ‹œ 배열에 μ•žμͺ½μ— λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 인덱슀 0 μžλ¦¬μ— 였게 되면 popleft()둜 μΆ”μΆœν•΄λ‚Έλ‹€. μ΄λ•ŒλŠ” 2번, 3번 연산에 ν•΄λ‹Ήν•˜μ§€ μ•ŠμœΌλ―€λ‘œ result 에 1을 더해주지 μ•ŠλŠ”λ‹€!

 

 

μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 전체 μ›μ†Œ κ°œμˆ˜μ—μ„œ 쀑앙보닀 였λ₯Έμͺ½μ— μœ„μΉ˜ν•  κ²½μš°μ—λŠ” μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 인덱슀 0 μžλ¦¬μ— 올 λ•ŒκΉŒμ§€ deque λͺ¨λ“ˆμ˜ pop() λ₯Ό μ‹€ν–‰ν•œλ‹€. μ‹€ν–‰ νšŸμˆ˜λŠ” n - idx λ²ˆμ΄λ‹€.(μ‹€ν–‰ν•  λ•Œ λ§ˆλ‹€ 횟수λ₯Ό μ²΄ν¬ν•΄μ•Όν•˜λ―€λ‘œ result 값에 1을 더해쀀닀.) 그리고 κ³§λ°”λ‘œ appendleft() ν•¨μˆ˜λ‘œ κ·Έ 값을 λ‹€μ‹œ 배열에 μ•žμͺ½μ— λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

이 λ˜ν•œ μœ„μ™€ 같이 μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 인덱슀 0 μžλ¦¬μ— 였게 되면 popleft()둜 μΆ”μΆœν•΄λ‚Έλ‹€. μ΄λ•ŒλŠ” 2번, 3번 연산에 ν•΄λ‹Ήν•˜μ§€ μ•ŠμœΌλ―€λ‘œ result 에 1을 더해주지 μ•ŠλŠ”λ‹€!

 

 

ν—·κ°ˆλ Έλ˜ 점

μΆ”μΆœν•΄λ‚΄κ³  싢은 값이 μ›μ†Œμ˜ λ§ˆμ§€λ§‰ μžλ¦¬μ— 있으면 κ±°κΈ°μ„œ λ°”λ‘œ pop() ν•˜λ©΄ λœλ‹€κ³  μƒκ°ν–ˆλŠ”λ° 문제λ₯Ό 잘 λͺ» μ½μ—ˆλ˜ κ²ƒμ΄μ—ˆλ‹€.

λ°˜μ‘ν˜•