배열 회전
배열 arr
[1,2,3]
[4,5,6]
[7,8,9] 를
에서 90도를 회전시키면
[7,4,1]
[8,5,2]
[9,6,3] 가 된다
배열을 나누어서 잘 살펴보면 arr[0]에 있던 원소들이 arr[0][0], arr[0][1], arr[0][2]로 각각 들어간 것을 볼 수 있다
이런 규칙에 따라서
function rotate (arr) {
const temp = Array(arr.length).fill().map(()=>Array(arr.length).fill().map(()=>null));
for(let y=0; y<arr.length;y++){
for(let x=0; x<arr.length;x++){
temp[y][x] = arr[arr.length-1-x][y];
}
}
return temp;
}
와 같이 시계 방향으로 회전시키는 함수를 만들 수 있다
두 번 회전은 함수를 두 번 세 번은 세 번 호출하면 되는 일이지만 그만큼 시간이 늘어나기 때문에 효율적이지 않은데
180도와 270도만큼 움직이는 경우의 인덱스들 또한 규칙적이기 때문에
function rotate (arr) {
const temp = Array(arr.length).fill().map(()=>Array(arr.length).fill().map(()=>null));
for(let y=0; y<arr.length;y++){
for(let x=0; x<arr.length;x++){
// temp[y][x] = arr[arr.length-1-x][y]; // 90도
// temp[y][x] = arr[arr.length-1-y][arr.length-1-x]; // 180도
// temp[y][x] = arr[x][arr.length-1-y]; // 반시계
}
}
return temp;
}
위와 같은 함수를 작성할 수 있다
Array의 내장 함수 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]
})
);
}
'Algorithm > 개념' 카테고리의 다른 글
비트 마스크 (0) | 2021.05.16 |
---|---|
Graph (0) | 2021.04.25 |
Sort - 기본 (0) | 2020.12.18 |
에라토스테네스의 체 (0) | 2020.12.13 |
Recursion - 순열 (0) | 2020.12.11 |