크기가 m x n인 하나의 2D 그리드가 있다고 가정합니다. 또 다른 변수 k가 있습니다. 그리드를 k번 이동해야 합니다. 시프트 작업은 다음과 같습니다.
-
그리드 G[i, j]의 요소가 G[i, j + 1]로 이동
-
그리드 G[i, n – 1]의 요소가 G[i + 1, 0]
으로 이동합니다. -
그리드 G[m - 1, n – 1]의 요소가 G[0, 0]으로 이동
따라서 그리드가 다음과 같은 경우 -
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
출력은 -
9 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
시프트 연산은 행렬을 입력으로 사용합니다.
-
n =행 수, m :=열 수, x :=오른쪽 하단 요소
-
for i :=n – 1, 0까지
-
j의 경우 :=m – 1에서 0으로
-
j =0이고 i> 0이면 G[i, j] :=G[i – 1, m – 1]
-
j> 0이면 G[i, j] :=G[i, j – 1]
-
-
-
G[0, 0] :=x
-
다음 규칙에 따라 시프트 연산을 호출하십시오 -
-
k가 0이 아닌 동안
-
그리드 G 이동
-
k를 1만큼 감소
-
-
그리드 G를 반환
예시(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<int> > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] <<", "; } cout << "],"; } cout << "]"<<endl; } class Solution { public: void shift(vector<vector<int>>& grid){ int n = grid.size(); int m = grid[0].size(); int x = grid[n-1][m-1]; for(int i = n-1; i>=0; i--){ for(int j = m-1;j>=0;j--){ if(j == 0 && i>0){ grid[i][j] = grid[i-1][m-1]; } else if(j>0){ grid[i][j] = grid[i][j-1]; } } } grid[0][0] = x; } vector<vector<int>> shiftGrid(vector<vector<int>>& g, int k) { while(k--){ shift(g); } return g; } }; main(){ Solution ob; vector<vector<int>> mat = {{1,2,3},{4,5,6},{7,8,9}}; print_vector(ob.shiftGrid(mat, 1)); }
입력
{{1,2,3},{4,5,6},{7,8,9}} 1
출력
[[9, 1, 2, ],[3, 4, 5, ],[6, 7, 8, ],]