1.문제
Given a 2D grid of size m x n and an integer k. You need to shift the grid k times.
In one shift operation:
- Element at grid[i][j] moves to grid[i][j + 1].
- Element at grid[i][n - 1] moves to grid[i + 1][0].
- Element at grid[m - 1][n - 1] moves to grid[0][0].
Return the 2D grid after applying shift operation k times.
mxn 크기의 2차원 배열이 주어질 때 이 행렬을 다음의 과정을 거치면 1번 shift하는 것이라고 정의한다
- grid[i][j] 는 grid[i][j+1] 로 이동
- grid[i][n-1] 은 grid[i+1][0] 로 이동
- grid[m-1][n-1] 은 grid[0][0] 로 이동
이런 조건에서 grid를 k 번 shift 했을 때의 grid 를 리턴하는 문제이다.
Example 1

Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
Output: [[9,1,2],[3,4,5],[6,7,8]]
Example 2

Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
Example 3
Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
Output: [[1,2,3],[4,5,6],[7,8,9]]
2.풀이
- 2차원 배열을 while문을 돌면서 주어진 조건대로 하나하나 이동한다.
- k번 이동을 하면 while문을 멈추고 grid를 리턴한다.
/**
* @param {number[][]} grid
* @param {number} k
* @return {number[][]}
*/
const shiftGrid = function (grid, k) {
let count = 0;
const m = grid.length;
const n = grid[0].length;
while (count < k) {
//mxn 배열 생성하기
const result = Array.from(Array(m), () => new Array(n).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
// 2번 이동 규칙
if (j === n - 1) {
if (i + 1 < m) {
result[i + 1][0] = grid[i][j];
}
} else {
// 1번 이동규칙
result[i][j + 1] = grid[i][j];
}
}
}
// 3번 이동규칙
result[0][0] = grid[m - 1][n - 1];
grid = result;
count++;
}
return grid;
};
3.결과
