코딩테스트를 풀다보면 아래 문제와 같이 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]
// 시계 방향으로 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 ]
위 코드는 행과 열의 수가 같은 행렬에서만 작동한다.
행과 열이 다른 경우는 조금 더 생각을 해봐야겠지만 위와 같은 규칙으로 구현할 수 있을 것 같다.
기회가 되면 행과 열이 다른 경우에서도 회전을 시킬 수 있는 코드를 한번 구현해 봐야겠다.