문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
m x n 이진 행렬 mat가 주어지고, 각 행렬은 1(군인)과 0(민간인)으로 구성된다. 군인은 민간인 앞에 배치되어 있다. 각 행에서 모든 1은 모든 0 왼쪽에 위치한다.
다음 중 하나라도 true이면 행 i는 행 j보다 약하다.
행렬에서 가장 약한 행부터 가장 강한 행 순으로 정렬된 k개의 가장 약한 행의 인덱스를 반환해라.
#1
Input: mat =
[[1,1,0,0,0],
[1,1,1,1,0],
[1,0,0,0,0],
[1,1,0,0,0],
[1,1,1,1,1]],
k = 3
Output: [2,0,3]
Explanation:
각 행의 군인 수는 다음과 같다.
- 행 0 : 2
- 행 1 : 4
- 행 2 : 1
- 행 3 : 2
- 행 4 : 5
약한 것부 강한 것까지 정렬한 행은 [2, 0, 3, 1, 4]이다.
#2
Input: mat =
[[1,0,0,0],
[1,1,1,1],
[1,0,0,0],
[1,0,0,0]],
k = 2
Output: [0,2]
Explanation:
각 행의 군인 수는 다음과 같다.
- 행 0 : 1
- 행 1 : 4
- 행 2 : 1
- 행 3 : 1
약한 것부 강한 것까지 정렬한 행은 [0, 2, 3, 1]이다.
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
int[][] rowStrengths = new int[mat.length][2];
for(int i = 0; i < mat.length; i++){
int strength = 0;
for(int val : mat[i]){
strength += val;
}
rowStrengths[i][0] = strength;
rowStrengths[i][1] = i;
}
Arrays.sort(rowStrengths, (a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
int[] result = new int[k];
for(int i = 0; i < k; i++){
result[i] = rowStrengths[i][1];
}
return result;
}
}