원래 제목
다음은 서버 분포 맵입니다. 서버의 위치는 m * n
정수 매트릭스 그리드 로 표시됩니다 grid
. 1은 셀에 서버가 있음을 의미하고 0은 서버가 없음을 의미합니다.
두 서버가 동일한 행이나 열에 있으면 서로 통신할 수 있다고 가정합니다.
하나 이상의 다른 서버와 통신할 수 있는 서버 수를 세어 반환해 주세요.
예시 1:
입력: 그리드 = [[1,0],[0,1]] 출력: 0 설명: 어떤 서버도 다른 서버와 통신할 수 없습니다.
예 2:
입력: Grid = [[1,0],[1,1]] 출력: 3 설명: 이러한 모든 서버는 적어도 하나의 다른 서버와 통신할 수 있습니다.
예시 3:
입력: 그리드 = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]] 출력: 4 설명: 첫 번째 행의 두 서버는 서로 통신하고, 세 번째 열의 두 서버는 서로 통신하지만 오른쪽 하단에 있는 서버는 다른 서버와 통신할 수 없습니다.
힌트:
m == grid.length
n == grid[i].length
1 <= m <= 250
1 <= n <= 250
grid[i][j] == 0 or 1
출처 : LeetCode 공식 홈페이지 - 전 세계 괴짜들이 사랑하는 기술 성장 플랫폼
문제 해결 아이디어
질문을 이해한 후에는 질문에서 행과 열의 2보다 크거나 같은 각 행과 열의 1 수를 세어야 한다는 것을 알게 될 것입니다. 문제를 해결하는 간단한 방법은 각 행과 열에 있는 1의 개수를 세고, 값 1로 각 지점을 순회하여 행과 열에 있는 1의 개수가 2보다 크거나 같은지 확인하는 것입니다. 따라서 우리는 공식 솔루션을 구현합니다.
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
unordered_map<int, int> rows, cols;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) {
++rows[i];
++cols[j];
}
}
}
int ans = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1 && (rows[i] > 1 || cols[j] > 1)) {
++ans;
}
}
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/count-servers-that-communicate/solutions/101819/tong-ji-can-yu-tong-xin-de-fu-wu-qi-by-leetcode-so/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
최적화 문제 해결
공식 솔루션에서는 모든 지점을 두 번 통과해야 하는데 최적화할 여지가 있나요? 실제로 각 행을 순회할 때 행에 있는 1의 수가 2보다 크거나 같으면 모두 결과와 일치하는 포인트입니다. 정확히 1과 같으면 이 열의 1 포인트 수가 2보다 크거나 같은지 나중에 확인해야 합니다. 따라서 이를 먼저 수집하고 최종적으로 판단하면 두 번째 라운드의 시간 복잡도를 O(n)으로 줄일 수 있습니다. 이 아이디어를 바탕으로 최적화된 버전은 다음과 같습니다.
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
unordered_map<int, int> cols;
int ans = 0,col = 0, rows=0;
vector<int> srows;
for(int i = 0; i < m;i++){
rows=0;
for(int j =0;j< n;j++){
if(grid[i][j] == 1){
++rows;
++cols[j];
col = j;
}
}
if(rows >= 2){
ans+=rows;
}else if(rows == 1){
srows.emplace_back(col);
}
}
for(int &j:srows){
if(cols[j]>=2){
++ans;
}
}
return ans;
}
};