Rotate
또는 ShiftRow
연산을 수행하면 됩니다.ShiftRow
연산은 간단하게 처리할 수 있을 것 같습니다.
Rotate
연산은 첫번째 행/마지막 행/첫번째 열/마지막 열의 원소를 동시에 이동시켜야 하므로, 한 개의 큐로 처리할 수 없습니다.Rotate
연산을 처리할 수 있을까요?left
: 첫 번째 열에 있는 원소를 저장mid
: 두 번째부터 (n-1)열에 있는 원소를 저장right
: 마지막 n열에 있는 원소를 저장Rotate
연산 시, 첫 번째 행과 마지막 행만 영향을 받게 됨을 주목하세요!Rotate
연산은 아래 네 번의 연산을 통해 O(1)의 시간 복잡도로 해결이 가능합니다.
left
의 첫 번째 원소는 mid
에 있는 첫 번째 큐의 첫 번째 위치로 이동합니다.mid
에 있는 첫 번째 큐의 마지막 원소는 right
의 첫 번째 위치로 이동합니다.right
에 있는 마지막 원소는 mid
에 있는 마지막 큐의 마지막 위치로 이동합니다.mid
에 있는 마지막 큐의 첫 번째 원소는 left
의 마지막 위치로 이동합니다.from collections import deque
def solution(rc, operations):
answer = []
left, mid, right = deque(), deque(), deque()
for element in rc:
left.append(element[0])
# append(), pop() 연산의 시간 복잡도를 O(1)로 수행하기 위하여, deque 자료형을 append합니다!
mid.append(deque(element[1:-1]))
right.append(element[-1])
for operation in operations:
if operation == 'ShiftRow':
left.appendleft(left.pop())
mid.appendleft(mid.pop())
right.appendleft(right.pop())
else:
mid[0].appendleft(left.popleft())
right.appendleft(mid[0].pop())
mid[-1].append(right.pop())
left.append(mid[-1].popleft())
while left:
answer.append([left.popleft()] + list(mid.popleft()) + [right.popleft()])
return answer
특정 원소를 다른 위치에 옮겨야 하는 상황에 시간 복잡도 이슈로 직관적인 풀이가 불가능 한 경우가 있습니다.
이럴 때는, 크게 다음과 같이 접근할 수 있습니다.