Algorithm
프로그래머스
Python
행렬과 연산

행렬과 연산

해설

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;
    }
}

Reference

https://velog.io/@ddongh1122/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%96%89%EB%A0%AC%EA%B3%BC-%EC%97%B0%EC%82%B0 (opens in a new tab)

참조

https://velog.io/@kevin622/Programmers-%ED%96%89%EB%A0%AC%EA%B3%BC-%EC%97%B0%EC%82%B0-2022-KAKAO-TECH-INTERNSHIP (opens in a new tab)