[BOJ 백준] - 회전하는 큐 1021 Python

Kim Dae Hyun·2021년 10월 27일
0

Algorithm

목록 보기
19/29
post-thumbnail

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


입력값 설명
n: 1~n까지 수가 큐에 순서대로 들어가게 된다.
m: m개 입력받은 정수를 큐에서 빼내야 한다.


문제설명

  1. 무조건 첫번째 원소를 뽑는다.

  2. 뽑은 원소가 찾는 값이 아니라면 왼쪽 혹은 오른쪽으로 회전한다.

  • 왼쪽회전: 1,2,3,4 -> 2,3,4,1
  • 오른쪽회전: 1,2,3,4 -> 4,1,2,3
  1. 왼쪽회전 혹은 오른쪽회전을 최소한으로 m개 숫자를 빼내라

풀이

찾고자 하는 값이 왼쪽에 가까운지 오른쪽에 가까운지 알아야 한다.
만약 왼쪽에 가깝다면 쭉 해당 값이 첫번째에 올 때까지 왼쪽 회전을 하면 된다.

만약 찾고자 하는 값이 오른쪽에 가깝다면 오른쪽 회전을 해서 찾고자 하는 값이 큐의 첫번째에 위치하면 된다.


회전하는 방법
왼쪽, 오른쪽 회전하는 함수를 따로 구현했다.

# 왼쪽회전
def rotate_left(q):
    front = q.pop(0) # 첫번째(왼쪽) 원소를 pop
    q.append(front) # pop한 원소를 오른쪽 끝에 추가한다.
    return q

def rotate_right(q):
    back = q.pop() # 마지막(오른쪽) 원소를 pop
    q.insert(0, back) # pop한 원소를 첫번째에 insert
    return q

리스트의 find 메서드를 이용했다.
find 메서드는 매개변수로 전달된 값이 리스트에 있다면 해당 인덱스를 반환한다.

찾고자 하는 숫자의 인덱스를 찾고 해당 인덱스가 전체길이-해당인덱스 보다 작다면 해당 인덱스는 왼쪽에 가깝다는 의미이므로 값을 찾을 때까지 왼쪽회전을 하며 카운트를 증가시킨다.

반대의 경우 오른쪽 회전

📌 전체코드


def rotate_left(q):
    front = q.pop(0)
    q.append(front)
    return q

def rotate_right(q):
    back = q.pop()
    q.insert(0, back)
    return q

n, m = map(int, input().split())
num_list = list(map(int, input().split()))
q = [i for i in range(1,n+1)]
res = 0

for num in num_list:
    qlen = len(q)
    idx = q.index(num)
    if idx < qlen - idx:
        while True:
            if num == q[0]:
                del q[0]
                break
            else:
                rotate_left(q)
                res += 1
    else:
        while True:
            if num == q[0]:
                del q[0]
                break
            else:
                rotate_right(q)
                res += 1

print(res)
profile
좀 더 천천히 까먹기 위해 기록합니다. 🧐

0개의 댓글