행렬과 연산
해설
Rotate
함수의 작성이 특히 어려웠는데 내가 이 문제를 통해서 배운점은 Queue
를 사용할 때 popleft()
를 하고 append()
를 하면 모든 순서를 바꿔줄 수 있다는 것이다.
부끄러워서 내 코드는 작성하지 않지만 나는 (x + 1) % y
와 같은 방법으로 인덱스를 구할려고 했는데 그게 생각처럼 잘 안됐다.
from collections import deque
def solution(rc, operations):
ROW = len(rc)
COLUMN = len(rc[0])
# 맨 왼쪽에 있는 컬럼들만 넣음
left_col = deque([rc[i][0] for i in range(ROW)])
# 맨 오른쪽에 있는 컬럼들만 넣음
right_col = deque([rc[i][COLUMN - 1] for i in range(ROW)])
# 외곽쪽에 있지 않은 컬럼들만 넣음
rows = deque([deque(rc[i][1:COLUMN - 1]) for i in range(ROW)])
for op in operations:
if op == 'ShiftRow':
# 각 컬럼들의 맨 앞부분에 맨 마지막 부분을 넣어줌
left_col.appendleft(left_col.pop())
rows.appendleft(rows.pop())
right_col.appendleft(right_col.pop())
else: # 'Rotate'
rows[0].appendleft(left_col.popleft())
right_col.appendleft(rows[0].pop())
rows[ROW - 1].append(right_col.pop())
left_col.append(rows[ROW - 1].popleft())
answer = []
for i in range(ROW):
answer.append([left_col[i]] + list(rows[i]) + [right_col[i]])
return answer
Java 풀이
import java.util.*;
class Solution {
public int[][] solution(int[][] rc, String[] operations) {
//초기화
int R = rc.length;
int C = rc[0].length;
ArrayDeque<Integer> leftCol = new ArrayDeque<>();
ArrayDeque<Integer> rightCol = new ArrayDeque<>();
ArrayDeque<ArrayDeque<Integer>> rows = new ArrayDeque<>();
for (int i = 0; i < R; i++) {
leftCol.add(rc[i][0]);
rightCol.add(rc[i][C-1]);
ArrayDeque<Integer> tmp = new ArrayDeque<>();
for (int j = 1; j < C-1; j++)
tmp.add(rc[i][j]);
rows.add(tmp);
}
//연산 수행
for (String op : operations) {
//ShiftRow
if (op.charAt(0) == 'S') {
leftCol.addFirst(leftCol.removeLast());
rightCol.addFirst(rightCol.removeLast());
rows.addFirst(rows.removeLast());
}
//Rotate
else {
//left -> top
rows.getFirst().addFirst(leftCol.removeFirst());
//top -> right
rightCol.addFirst(rows.getFirst().removeLast());
//right -> bottom
rows.getLast().addLast(rightCol.removeLast());
//bottom -> left
leftCol.addLast(rows.getLast().removeFirst());
}
}
int[][] result = new int[R][C];
for (int i = 0; i < R; i++) {
result[i][0] = leftCol.removeFirst();
result[i][C-1] = rightCol.removeFirst();
ArrayDeque<Integer> tmp = rows.removeFirst();
for (int j = 1; j < C-1; j++)
result[i][j] = tmp.removeFirst();
}
return result;
}
}