[Python, JS] 2차원 배열 회전 알고리즘

홍건우·2021년 2월 23일
0

코딩테스트를 풀다보면 아래 문제와 같이 2차원 배열 90°회전을 요구하는 문제가 있다.
2020 KAKAO BLIND RECRUITMENT
그래서 for문을 사용한 2차원 배열 90°회전에 대해 공부한 것을 작성해볼 것이다.


과정

90° 회전하기 전

b a -
c - -
- - -

90° 회전후

- c b
- - a
- - -

이때 a, b, c 각각의 좌표는 다음과 같다

90° 회전전90° 회전후
a(0, 1)(1, 2)
b(0, 0)(0, 2)
c(1, 0)(0, 1)

위의 좌표값 변화에서 규칙을 찾아볼 수 있다.

회전전의 열 번호와 회전후의 행 번호는 일치하며
회전후의 열은 N(표의 길이)-1에서 회전전의 행을 뺀 값과 같다.

이제 코딩을 해보자.


파이썬 코드

def rotate_90_degree(arr):
    n = len(arr)
    rotate_arr = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            rotate_arr[j][n - 1 - i] = arr[i][j]
    return rotate_arr

arr = [
    ['b', 'a', 0],
    ['c', 0, 0],
    [0, 0, 0]]

arr = rotate_90_degree(arr)

for x in arr:
    print(x)


#출력값
#[0, 'c', 'b']
#[0, 0, 'a']
#[0, 0, 0]

JS 코드

//  시계 방향으로 90도 회전
function rotateArr(box) {
  let box_max_index = box.length - 1;
  let new_box = Array.from({length: box.length}, () => Array.from({length: box.length}, () => 0));

  for (let i = 0; i < box.length; i++) {
    for (let k = 0; k < box[i].length; k++) {
      let after_row = k;  // 이동되기 전 행의 열은 이동된 후의 행이 된다.
      let after_col = box_max_index - i;  // 이동되기 전 행은 이동된 후의 열에 "2차원 배열의 최대 인덱스 - 이동되기 전 행의 인덱스"이 된다.
      new_box[after_row][after_col] = box[i][k];
    }
  }

  return new_box;
}

console.log(rotateArr([[1, 2, 3], [4, 5, 6], [7, 8, 9]]));
//회전하기 전 배열
// [ 1, 2, 3 ],
// [ 4, 5, 6 ],
// [ 7, 8, 9 ]

//회전 후 배열
// [ 7, 4, 1 ],
// [ 8, 5, 2 ],
// [ 9, 6, 3 ]

마치며

위 코드는 행과 열의 수가 같은 행렬에서만 작동한다.
행과 열이 다른 경우는 조금 더 생각을 해봐야겠지만 위와 같은 규칙으로 구현할 수 있을 것 같다.
기회가 되면 행과 열이 다른 경우에서도 회전을 시킬 수 있는 코드를 한번 구현해 봐야겠다.

profile
컴퓨터공학과 학생입니다

0개의 댓글