n x m 행렬 Mat가 있다고 가정하고 대각선의 모든 요소가 정렬되도록 이 Mat를 왼쪽 위에서 오른쪽 아래로 증가하는 순서로 대각선으로 정렬해야 합니다. 따라서 입력 행렬이 −
와 같은 경우| 3 | 3 | 1 | 1 |
| 2 | 2 | 1 | 2 |
| 1 | 1 | 1 | 2 |
출력 행렬은 -
| 1 | 1 | 1 | 1 |
| 1 | 2 | 2 | 2 |
| 1 | 2 | 3 | 3 |
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
solve()라는 메서드를 정의합니다. 이것은 si, sj 및 행렬 매트를 사용합니다.
-
n :=행 수 및 m :=열 수
-
temp
라는 배열을 만듭니다. -
i:=si 및 j :=sj 및 인덱스 :=0
-
i
-
m[i, j]를 temp에 삽입한 다음 i와 j를 1 증가시킵니다.
-
-
임시 배열 정렬
-
인덱스 설정 :=0, i :=si 및 j :=sj
-
i
동안 -
매트[i, j] :=온도[색인]
-
i, j 및 인덱스를 1 증가
-
-
기본 방법에서 다음을 수행하십시오 -
-
n :=행 수 및 m :=열 수
-
0 ~ n – 1 범위의 i에 대해 수행
-
해결(i, 0, 매트)
-
-
범위 1에서 m – 1까지의 j에 대해 수행
-
해결(0, j, 매트)
-
-
리턴 매트
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > 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 solve(int si, int sj, vector < vector <int> > &mat){
int n = mat.size();
int m = mat[0].size();
vector <int> temp;
int i = si;
int j = sj;
int idx = 0;
while(i < n && j < m){
temp.push_back(mat[i][j]);
i++;
j++;
}
sort(temp.begin(), temp.end());
idx = 0;
i = si;
j = sj;
while(i < n && j < m){
mat[i][j] = temp[idx];
i++;
j++;
idx++;
}
}
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
int n = mat.size();
int m = mat[0].size();
for(int i = 0; i <n; i++){
solve(i, 0, mat);
}
for(int j = 1; j < m; j++){
solve(0, j, mat);
}
return mat;
}
};
main(){
vector<vector<int>> v = {{3,3,1,1},{2,2,1,2},{1,1,1,2}};
Solution ob;
print_vector(ob.diagonalSort(v));
} 입력
{{3,3,1,1},{2,2,1,2},{1,1,1,2}} 출력
[[1, 1, 1, 1, ], [1, 2, 2, 2, ], [1, 2, 3, 3, ],]