N x M 행렬이 있다고 가정하고 이것을 왼쪽 위에서 오른쪽 아래로 오름차순으로 대각선으로 정렬해야 합니다. 따라서 행렬이 다음과 같은 경우 -
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, 매트)
-
-
리턴 매트
예시(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#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]]