본문 바로가기

알고리즘

백준 1021 회전하는 큐 파이썬 [개인적인 풀이 과정]

첫 번째 입력으로 큐의 크기와 뽑아내려는 수의 개수

두 번째 입력으로 뽑아내려 하는 수의 위치가 순서대로 주어진다.

문제는 이해가 되고, 두 번째 줄에 입력되는 값이 큐의 위치에서 중간보다 앞에 있으면 좌로이동(2번 연산)

뒤에 있으면 우로이동(3번 연산)을 하는 것이 2, 3번 연산의 최솟값이 될 것 이라는 것은 알았다.

기존에 알던 리스트로 풀려고 했는데 도저히 2번과 3번 연산을 어떻게 해야 리스트에서 구현이 가능할까? 생각하다가

리스트의 0번째 인덱스를 del로 지우기 전에 append하고, 원래 있던 0번째 인덱스를 del로 지우면 2번 연산이 가능하겠다 생각했지만 3번 연산은 어떻게 해야할지 엄두가 안났다. append를 앞에 할수도 없고, 하고나서 정렬을 하는 것도 순서가 안맞아서 안되기 때문에 난감했다.

 

다른분의 풀이를 봤는데 deque를 임포트하여 사용하면 앞과 뒤에서 삽입과 삭제가 가능하여 스택처럼 또는 큐처럼 자유자재로 사용할 수 있다. 여기서는 appendleft와 popleft사용이 가능하여 왼쪽 오른쪽으로 쉽게 이동이 가능함을 알 수 있다. (popleft는 여기서 삭제하는 역할만 하기 때문에 del로 대체가 가능하다.)

첫 번째 줄에 10 3

두 번째 줄에 2 9 5가 들어간 경우를 프린트해봤다.

 

코드 출처 : https://wiselog.tistory.com/126
최대한 알아보기 쉽게 바꿔 봄

 

dq = deque([i for i in range(1, n+1)]) 여기서

i for i in <-- 이게 무엇을 뜻하는지 모르겠다.

없든 있든 값이 동일하게 나오는데 왜, 어떻게 쓰는지 궁금하다. 거의 모든 블로그에서 해당 형태로 사용하고 있었고, 이유에 대해 설명된 곳은 아직 못봤다. 내가 검색능력이 부족한지 검색해도 잘 보이지 않는다.

 

break, continue, 반복문 안의 반복문 형태가 조금 헷갈린다. 다시 찾아보고 재정립이 필요하다.

같은 기능을하는 다양한 표현으로 제출해봤다. readline 사용, pop대신 del 사용으로 바꾼 23분전 코드가 제일 빠르게 나타났다.

 

*오류 지적, 개선된 방법 알려주시면 정말 감사합니다!