Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발 일지

1337. The K Weakest Rows in a Matrix (행렬에서 가장 약한 K 행) 본문

코딩 테스트/LeetCode

1337. The K Weakest Rows in a Matrix (행렬에서 가장 약한 K 행)

포카리tea 2023. 11. 3. 17:15

1's(군인을 나타냄)와 0's(민간인을 나타냄)의 m*n 이진 행렬 매트가 주어집니다. 군인들은 민간인들 앞에 배치됩니다. 즉, 각 행에 있는 모든 0의 왼쪽에 모든 1의 행렬이 나타납니다.

다음 중 하나가 참일 경우 i행이 j행보다 약합니다:

  • i행의 군인의 수가 j행의 군인의 수보다 적을 경우.
  • 두 행 모두 동일한 수의 군인일 경우 i < j.

가장 약한 행부터 가장 강한 정렬된 행렬에서 k까지의 행렬을 반환합니다.

 

예시 1:

입력: 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
출력: [2,0,3]
설명:
각 행의 군인의 수는 다음과 같습니다:
- 0행: 2
- 1행: 4
- 2행: 1
- 3행: 2
- 4행: 5
가장 약한 행에서 가장 강한 행으로 순서가 매겨진 행은 [2,0,3,1,4]입니다.

 

예시 2:

입력: mat =
[[1,0,0,0],
[1,1,1,1],
[1,0,0,0],
[1,0,0,0]],
k = 2
출력: [0,2]
설명:
각 행의 군인의 수는 다음과 같습니다:
- 0행: 1
- 1행: 4
- 2행: 1
- 3행: 1
가장 약한 행에서 가장 강한 행으로 순서가 매겨진 행은 [0,2,3,1]입니다.

 

조건:

  • m == mat.length
  • n == mat[i].length
  • 2 <= n, m <= 100
  • 1 <= k <= m
  • matrix[i][j]은 0 또는 1입니다.

 

정답:

public class Solution {
    public int[] KWeakestRows(int[][] mat, int k) {
         Dictionary<int, int> result = new Dictionary<int, int>();

        for (int i = 0; i < mat.Length; i++)
        {
            result.Add(i, Array.FindAll(mat[i], x => x == 1).Length);
        }
        
        result = result.OrderBy(item => item.Value).ToDictionary(x => x.Key, x => x.Value);

        return result.Keys.Take(k).ToArray();
    }
}

해설: 일단 Dictionary를 만들어주어 해당 i행의 군인의 수를 세준 후 Linq를 이용하여 군인의 수를 기준으로 오름차 순으로 정렬해주었습니다.

그리고 군인의 수를 기준으로 정렬된 Dictionary의 Key 값만 Take로 k까지 잘라서 return 해주었습니다.