배열을 90도 회전시키는 방법
2022. 8. 9. 18:07ㆍ알고리즘
올해 4월이었나 카카오 인턴 코테를 아무 준비 없이 경험삼아서 본 적이 있습니다.
근데 이제 거기서 나왔던 문제가 N X N 배열을 조금씩 회전하는 게 5번문제였던 기억이 납니다.
([0][0] => [0][1] / [1][0] => [0][0] 이런 느낌의 회전이었어요ㅠㅠ)
가운데 중점 기준으로 교차하는 직선 두개 그리면서 규칙성 찾다가 하지도 못하고 끝났었는데요. 갑자기 ptsd 오네요.
이 회사 코테는 참 배열 회전하는걸 좋아하나봐요. 2020년에도 2021년에도 배열 90도 회전하는 문제가 나왔었습니다.
이젠 뭐 90도는 다 잘한다고 생각해서 이런걸 내는건지..
불평하면 달라질까요? 신입이면 하라면 해야죠! 일단 차근차근 90도 회전부터 다뤄보죠!
90도 회전은 그나마 합리적입니다.
몇 가지 규칙이 있거든요.
첫 번째 row를 기준으로 이런 규칙성이 성립합니다.
- (원본) row + (rotate) col = N -1( 4 X 4 배열이니 N = 4)
- (원본) col = (rotate) row
그러면 규칙성대로 정방향 회전하는 함수를 같이 한번 짜보죠!
solution) 90 deg rotate
function rotate(arr) {
const [maxRow, maxCol] = [arr.length, arr[0].length];
const result = Array.from({length: maxRow}, () => Array(maxCol).fill(0));
for (let row = 0; row < maxRow; row++) {
for (let col = 0; col < maxCol; col++) {
result[col][maxRow - row - 1] = arr[row][col];
}
}
return result;
}
조심하셔야 할 점은 N x N 형태의 배열이 아니라 N x M 형태의 배열인 경우입니다.
2 x 3이 3 x 2 형태로 변환되기 때문에 외부에서 index 같은 걸로 조작할 때 런타임 에러를 조심하셔야 해요.
다음엔 한번씩 회전하는 방법을 들고 올까 합니다. 그럼 이만!
'알고리즘' 카테고리의 다른 글
[JS] 파괴되지 않은 건물: (new) 누적합 (1) | 2022.09.20 |
---|---|
[JS] 트리와 힙의 차이는 뭘까? (0) | 2022.09.18 |
[JS] 플로이드-워셜 알고리즘: 다익스트라 같은데 뭔가 안될때 (0) | 2022.09.01 |