문제
길이가 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)는 대략 다음과 같다.
|
# 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)))
'코테풀이 > 큐' 카테고리의 다른 글
[백준 | 실버3] 1966: 프린터 큐(큐) (0) | 2022.03.25 |
---|---|
[백준 | 실버4] 11866번: 요세푸스 문제0(큐) (0) | 2022.03.23 |