λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm/λ°±μ€€(BOJ)

[ 파이썬(python) ] λ°±μ€€ 1021 - νšŒμ „ν•˜λŠ” 큐

by YWTechIT 2021. 6. 27.
728x90

πŸ“Œ λ°±μ€€ 1021 - νšŒμ „ν•˜λŠ” 큐

λ°±μ€€ 1021 - νšŒμ „ν•˜λŠ” 큐


πŸ’‘ λ‚˜μ˜ 풀이

μ²˜μŒμ—λŠ” ν•œ λ²ˆμ— 2번 μ—°μ‚° ν˜Ήμ€ 3번 연산을 λ”°λ‘œλ”°λ‘œ μ§„ν–‰ν•˜κ³  λ‘˜ 쀑 μž‘μ€ 값을 좜λ ₯ν•˜λŠ” 건 쀄 μ•Œμ•˜λŠ”λ°, arr을 보고 더 κ°€κΉŒμš΄ μͺ½μ— 2번 μ—°μ‚°, 3번 연산을 νŒλ‹¨ν•΄μ„œ ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμ˜€λ‹€. λ¨Έλ¦¬λ‘œλŠ” μ΄ν•΄ν–ˆλŠ”λ° 막상 κ΅¬ν˜„ν•˜λ €λ‹ˆκΉŒ 잘 λ– μ˜€λ₯΄μ§€ μ•Šμ•˜λ‹€. κ²°κ΅­, ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ ν’€μ—ˆμ§€λ§Œ 왠지 μ½”λ“œκ°€ λ§Žμ•„ λ³΄μ˜€λ‹€.

 

  1. ν˜„μž¬ arr을 보고 target값을 μ•ž / λ’€μ—μ„œλΆ€ν„° λͺ‡ 번째 λ–¨μ–΄μ ΈμžˆλŠ”μ§€ κ³„μ‚°ν•œ indexλ₯Ό returnν•œλ‹€.(compare_min_length)
  2. μ•žμͺ½μ΄ 더 κ°€κΉŒμš°λ©΄ 2번 연산을 μ§„ν–‰ν•œλ‹€.(front_rotate)
  3. λ’€μͺ½μ΄ 더 κ°€κΉŒμš°λ©΄ 3번 연산을 μ§„ν–‰ν•œλ‹€.(back_rotate)

λ‹€λ₯Έ μ‚¬λžŒμ˜ μ½”λ“œλ₯Ό λ³΄λ‹ˆκΉŒ 2, 3번 연산은 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ python - dequeλΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” rotate λ‚΄μž₯ ν•¨μˆ˜κ°€ κ΅¬ν˜„λ˜μ–΄μžˆμ—ˆλ‹€. λ‹€μŒλ²ˆμ— κΌ­ 써먹으리라..

그리고 λ‹€λ₯Έ μ‚¬λžŒμ€ forλ¬Έ μ•ˆμ— while문을 λ„£μ–΄ μž‘μ„±ν–ˆλŠ”λ° μ½”λ“œλ„ 짧고 가독성이 μ’‹μ•„ λ³΄μ˜€λ‹€. μƒˆλ‘œ 배운 점은 arr의 길이λ₯Ό κΈ°μ€€μœΌλ‘œ target_indexκ°€ μ•žμͺ½μ—μ„œ κ°€κΉŒμš΄μ§€ λ’€μͺ½μ—μ„œ 더 κ°€κΉŒμš΄μ§€ νŒλ‹¨ν•˜λŠ” 15번 μ½”λ“œμΈλ° κ°„κ²°ν•΄ λ³΄μ˜€λ‹€. 또, rotate(-1)은 2번 연산이고 rotate(1)은 3번 연산이닀.

# λ‚˜μ˜ μ½”λ“œ
from collections import deque
n, m = map(int, input().split())
target_indexes = list(map(int, input().split()))
cnt = 0
arr = deque([i for i in range(1, n+1)])

def compare_min_length(target):
    global arr
    for i in range(len(arr)):
        if arr[i] == target:
            return i, len(arr)-i-1

def front_rotate(target, cnt):    # μ™Όμͺ½μœΌλ‘œ 이동
    global arr
    while True:
        if arr[0] == target:
            arr.popleft()
            return cnt
        arr.append(arr.popleft())
        cnt += 1

def back_rotate(target, cnt):    # 였λ₯Έμͺ½μœΌλ‘œ 이동
    global arr
    while True:
        if arr[0] == target:
            arr.popleft()
            return cnt
        arr.appendleft(arr.pop())
        cnt += 1

for target in target_indexes:
    front, back = compare_min_length(target)
    if front <= back:
        temp_cnt = front_rotate(target, cnt)
    else:
        temp_cnt = back_rotate(target, cnt)
    cnt = temp_cnt
print(cnt)
# λ‹€λ₯Έμ‚¬λžŒμ˜ μ½”λ“œ
from collections import deque

n, m = map(int, input().split())
target_indexes = list(map(int, input().split()))
cnt = 0
arr = deque([i for i in range(1, n+1)])

for target in target_indexes:
    while True:
        if arr[0] == target:
            arr.popleft()
            break
        else:
            if arr.index(target) <= len(arr) // 2:
                arr.rotate(-1)
            else:
                arr.rotate(1)
            cnt += 1
print(cnt)
λ°˜μ‘ν˜•

λŒ“κΈ€