공기청정기 - 밀기 복습(deque.rotate)

파송송계란빡 ㅣ 2022. 2. 15. 15:03

문제


길이가 m인 수열이 n개 존재한다. n, m, q와 이 수열들의 초기 상태가 0번 수열부터 n-1번 수열까지 순서대로 주어진다. 각 질문은 세 정수 f, x, y로 주어지는데, x가 1이면 f번 수열을 오른쪽으로 y칸 밀어낸 결과를, x가 2면 f번 수열을 왼쪽으로 y칸 밀어낸 결과를 출력하여라.

단, 각 수열의 모양은 다음 그림처럼 원형이라서 n-1번 인덱스의 다음 칸은 0번이다. 각 질문에 의해 밀린 수열은 원래대로 복구하지 않는다. 즉, 같은 수열을 여러 번 밀게 된다면 이전에 밀린 상태에서 추가로 밀어서 출력한다.

입력


첫 줄에 수열의 수 n과 수열의 길이 m, 질문의 수 q가 주어진다.

두 번째 줄부터 n개의 줄에 걸쳐 각 수열을 구성하는 수 m개가 주어진다.

세 번째 줄부터 q개의 줄에 걸쳐 f, x, y가 주어진다.

(3 ≤ n, m ≤ 1,000, 1 ≤ q ≤ 100, 0 ≤ f ≤ n-1, 1 ≤ 수열을 구성하는 수, y ≤ m, 1 ≤ x ≤ 2)

출력


q줄에 각 질문에 대한 답을 출력한다.

입력의 예

4 5 3
2 3 1 5 4
1 3 5 4 2
4 5 1 2 3
1 3 5 2 4
0 1 2
0 2 1
1 2 3

출력의 예

5 4 2 3 1
4 2 3 1 5
4 2 1 3 5

 

풀이

4 5 3    <------- row=4, colum=5, question_num = 3
2 3 1 5 4   <--- row 시작
1 3 5 4 2
4 5 1 2 3
1 3 5 2 4   <--- row 끝
0 1 2        <---  0번 수열을 오른쪽(->)으로 2칸 밀기
0 2 1        <---    0번 수열을 왼쪽(<-)으로 1칸 밀기
1 2 3        <---    1번 수열을 왼쪽(<-)으로 3칸 밀기

 

 - 파이썬 collections의 deque에 deq.rotate를 이용해서 풀기

데크(deque)에 존재하는 메서드(method)는 대략 다음과 같다.
  • deque.append(item): item을 데크의 오른쪽 끝에 삽입한다.
  • deque.appendleft(item): item을 데크의 왼쪽 끝에 삽입한다.
  • deque.pop(): 데크의 오른쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
  • deque.popleft(): 데크의 왼쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
  • deque.extend(array): 주어진 배열(array)을 순환하면서 데크의 오른쪽에 추가한다.
  • deque.extendleft(array): 주어진 배열(array)을 순환하면서 데크의 왼쪽에 추가한다.
  • deque.remove(item): item을 데크에서 찾아 삭제한다.
  • deque.rotate(num): 데크를 num만큼 회전한다(양수면 오른쪽, 음수면 왼쪽).
# Contain 1, 2, 3, 4, 5 in deq
deq = deque([1, 2, 3, 4, 5])

deq.rotate(1)
print(deq)
# deque([5, 1, 2, 3, 4])

deq.rotate(-1)
print(deq)
# deque([1, 2, 3, 4, 5])

출처 : https://leonkong.cc/posts/python-deque.html

 

- 기존에는 일일히 인덱스별로 하나씩 밀었는데 deq.rotate를 사용하면 쉽고 빠르게 밀수있다.

- 방향이 1인 경우 move 만큼 오른쪽(->) 밀기

- 방향이 2인 경우 move * (-1) 만큼 왼쪽(<-) 밀기

from collections import deque

#deque.rotate(num): 데크를 num만큼 회전한다(양수면 오른쪽, 음수면 왼쪽)
def is_push(index, direction, move) :
  if direction == 1:
    deq = deque(data_list[index])
    deq.rotate(move)
  else :
    deq = deque(data_list[index])
    temp = move * (-1)
    deq.rotate(temp)
  
  data_list[index] = deq
  
  return data_list[index]
  

if __name__ == "__main__":
  row, colum, question_num = map(int, input().split())
  
  data_list = []
  
  for i in range(row) :
    data_list.append(map(int, input().split()))
    
  for i in range(question_num) :
    start_index, direction, move_count = map(int, input().split())
    result_list = is_push(start_index, direction, move_count)
    print(" ".join(map(str, result_list)))
공기청정기 - 밀기 복습(deque.rotate)