Bakejoon/Silver

[Python] 백준 1021번 : 회전하는 큐 <Silver 3>

chattymin 2022. 5. 22. 15:57
728x90

⚠️ 내맘대로 작성한 코드이기 때문에 비합리적 진행과 근거없는 추론이 있을 수 있습니다!⚠️

 

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

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

Code


import sys
input = sys.stdin.readline
from collections import deque

max, cycle = map(int, input().split())
list = deque(range(1,max+1))
numbers = deque(map(int, input().split()))

count = 0

while numbers:
    mid = len(list)//2
    if list.index(numbers[0]) > mid: # 오른쪽으로 회전
        while list[0] != numbers[0]:
            list.appendleft(list.pop())
            count += 1
        list.popleft()
        numbers.popleft()
    else: # 왼쪽으로 회전
        while list[0] != numbers[0]:
            list.append(list.popleft())
            count += 1
        list.popleft()
        numbers.popleft()

print(count)

Code 필수 요소

1. 큐(덱)에 대한 개념의 이해 및 함수 활용법

2. 좌, 우 회전방향 결정 조건

 

이것만 생각해내면 절반은 끝났다.

 

// deque 

list라는 리스트에 max+1만큼의 크기에 1부터 max+1까지의 값을 포함하게 만들어주었다.

회전하는 큐를 진행할 때 실제로 숫자 리스트를 만드로 회전시키며 제거하는 방식을 사용했다.

그리고 제거할 숫자의 리스트를 만들어서 똑같이 제거해주며 리스트가 비었을 경우 반복을 종료하게 설계했다.

 

// 좌, 우 회전방향 결정 조건

숫자가 앞에 가까우면 왼쪽으로 회전하고, 숫자가 뒷쪽에 가까우면 오른쪽으로 회전해야 한다는 기본적인 내용으로부터 시작했다.

중간값을 구하고, 그 값보다 옮기고자 하는 값의 인덱스가 클 경우 오른쪽으로, 작을경우 왼쪽으로 회전시켰다.

 

음.. 이게 전부다 ㅋㅋㅋㅋ

예전에 C언어로 구현한 적이 있는데 그때는 뭐랄까... 상당히 조잡했지만 내 생각을 이용해서 짠 느낌이라면

파이썬으로 구현한 이 코드는 정형화된 틀에 맞춰서 원리 원칙대로 짠 느낌이다.

C언어로 구현한 코드가 내 머리를 더 많이 사용한거라 더 공부라는 목적에는 맞았던거 같다.

뭐 여튼 깔끔하게 짜는것도 배웠으니까 오히려 좋아

C로 짠거도 한번 구경하고 가주라. 많이 더럽긴 한데 그래도 꽤나 열심히 짰다 ㅋㅋㅋㅋㅋ

https://naemamdaelo.tistory.com/3 

 

[C언어] 백준 1021번 : 회전하는 큐

⚠️ 내맘대로 작성한 코드이기 때문에 비합리적 진행과 근거없는 추론이 있을 수 있습니다 ⚠️ 문제 링크 : https://www.acmicpc.net/problem/1021 1021번: 회전하는 큐 첫째 줄에 큐의 크기 N과 뽑아내려

naemamdaelo.tistory.com

 

 

 

-꿑-

728x90