CS/Data Structure & Algorithm
01. 이차원 배열 회전
Hov
2021. 4. 6. 12:56
코딩테스트 문제를 풀다보면 이차원 배열을 시계방향으로 90도 회전할 일이 종종 있다.
00 > 02 | 01 > 12 | 02 > 22 |
10 > 10 | 11 > 11 | 12 > 21 |
20 > 00 | 21 > 10 | 22 > 20 |
위 표를 자세히 보면 A(i, j)에서 90도 회전을 하면 A(m - 1 - j, i)로 넘어간다는 것을 확인 할 수 있다.
해서 이중 for문을 이용해 간단하게 구현할 수 있을 줄 알았는데 array deep copy를 하는 데에서 헤메고 말았다.
분명히 [...arr]로 Deep Copy를 했다고 생각했는데 arr를 변경하자 복사한 배열인 tmpArr가 함께 변경되는 것이었다.
이중 배열이다 보니 안의 배열들은 그대로 shallow copy가 되기 때문이었고, 결국 배열의 각 행을 탐색해 들어가며
행별로 deepcopy를 해주어야 했다.
//배열을 회전하는 함수
function rotate(arr) {
const tmpArr = [...arr];
const N = arr.length;
//이중배열 Deep Copy
for (let i = 0 ; i < N ; i ++) {
tmpArr[i] = [...arr[i]];
}
//이중배열 시계방향으로 90도 회전시키기!
for (let i = 0 ; i < N ; i ++) {
for(let j = 0 ; j < N ; j ++) {
let y = j;
let x = N - 1 - i;
if (x < 0) {
x = M - 1;
}
arr[y][x] = tmpArr[i][j];
}
}
}