이중반복으로 만들어지는 이차원배열....이걸 머리써서 생각하려고하니 벌써부터 어지러워진다.
아무리 머리를 짜내서 짜보려고해도 머리만 아프고 진전이 없다.
나는 그래서 이차원배열만을 정리 해놓고 조건에 따라 만드는 모든 방법들을 외워버려야겠다고 생각했다.
먼저, 2차원 배열을 만드는 법부터 알아보자.
내가 자주 사용하는 공식,
let matrix = Array.from(Array(arr.length), () => Array(arr.length).fill(0)); // [[0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0]]
문제마다 푸는 방식이 다르겠지만, 인접행렬이나 그래프문제를 풀 때는 배열의 해당 인덱스에 0,1을 할당하는 방식으로 접근한다.
알고리즘 문제를 풀다가, 이 배열을 회전해서 풀면 더 쉽겠는데? 라는 생각에서 시작하여, 직접 로직을 짜보려다가 쉽지않아서, 인터넷을 참조하여 정리한다.
시작은 rotate 함수를 만드는 법 부터 시작한다. 앞서 , 2차원의 빈 matrix를 만들었기 때문에 그 과정은 생략한다.
function rotate(matrix) { for (let y = 0; y < matrix.length; y++) { for (let x = 0; x < matrix.length; x++) { [y][x] = matrix[matrix.length - 1 - x][y]; // 시계방향 90도 회전 temp[y][x] = matrix[matrix.length - 1 - y][matrix.length - 1 - x]; // 180도 회전. temp[y][x] = matrix[x][matrix.length - 1 - y]; // 반시계방향 90도 회전 temp[y][x] = matrix[matrix.length - 1 - x]; // 위,아래 자리바꾸기 (180도 회전를 좌우반전) } } return temp; }
좌우 반전 공식이 있나 무지성으로 엄청 찾아봤는데.. 아무리 찾아도 안나와서
곰곰히 다시 생각해보니깐 좌우 반전은 그냥 좌우반전하고 싶은 배열에다가 map을 사용해서 해당 element에 배열 reverse 메소드를 써주면 좌우반전이 된다.. 깨닫고나서 굉장히 허무했다.
map을 이용하면 더 간단하게 쓸 수 있다.
function rotate1(arr){ return arr.map((row,y) => row.map((col,x)=>{ return arr[arr.length-1-x][y] // return arr[arr.length-1-y][arr.length-1-x] // return arr[x][arr.length-1-y] }) }