[프로그래머스 C++] 네트워크

 

https://school.programmers.co.kr/learn/courses/30/lessons/43162

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

해결전략

 

너비우선탐색 BFS 

유니온 앤 파인드 Union & Find

 

아래 풀이는 BFS


 

 

처음 시도한 코드

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int answer; // 네트워크 개수
int cnt; // 연결된 컴퓨터 수
vector<vector<int>> ch; // 방문 여부를 체크
void BFS(int start, int n, vector<vector<int>> com) // BFS를 수행하여 연결된 컴퓨터들을 방문
{
queue<int> Q;
Q.push(start);
while (!Q.empty())
{
int curr = Q.front();
Q.pop();
ch[curr][curr] = 1; // 현재 컴퓨터 방문 표시
for (int i = 0; i < n; i++)
{
if (ch[curr][i] == 0 && com[curr][i] == 1) { // 연결된 컴퓨터 찾기
ch[curr][i] = 1; // 방문 표시
ch[i][curr] = 1; // 방문 표시
Q.push(i); // 다음 컴퓨터를 큐에 추가
cnt++; // 연결된 컴퓨터 수 증가
//cout << "curr = " << curr << ", next = " << i << "\n";
}
}
}
}
int solution(int n, vector<vector<int>> computers) {
ch.resize(n, vector<int>(n));
for (int i = 0; i < n; i++)
{
if (ch[i][i] == 0) { // 방문하지 않은 컴퓨터 찾기
BFS(i, n, computers);
}
}
answer = n - cnt; // 네트워크 수 계산
return answer;
}
int main() {
vector<vector<int>> computers = {
{1, 1, 0},
{1, 1, 0},
{0, 0, 1}
};
cout << solution(3, computers) << "\n; // 올바른 결과값: 2, 출력되는 결과값: 1
return 0;
}

 

 

실수한 부분

  • answer = n - cnt; 로 네트워크의 수를 계산하려고 했다. 
  • cnt는 전체 컴퓨터 수가 아니라 BFS가 수행될 때마다 증가하는 연결된 컴퓨터의 수를 나타낸다.
  • cnt가 정확하게 네트워크의 수를 반영하지 않기 때문에 문제가 된다.

 

 

정답코드 

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int answer; // 네트워크 개수
vector<int> visited; // 방문 여부를 체크
void BFS(int start, int n, vector<vector<int>>& computers) // BFS를 수행하여 연결된 컴퓨터들을 방문
{
queue<int> Q;
Q.push(start);
while (!Q.empty())
{
int curr = Q.front();
Q.pop();
ch[curr][curr] = 1; // 현재 컴퓨터 방문 표시
for (int i = 0; i < n; i++)
{
if (ch[curr][i] == 0 && com[curr][i] == 1) { // 연결된 컴퓨터 찾기
ch[curr][i] = 1; // 방문 표시
ch[i][curr] = 1; // 방문 표시
Q.push(i); // 다음 컴퓨터를 큐에 추가
}
}
}
}
int solution(int n, vector<vector<int>> computers) {
visited.resize(n, 0);
for (int i = 0; i < n; i++)
{
if (ch[i][i] == 0) { // 방문하지 않은 컴퓨터 찾기
BFS(i, n, computers); // BFS 수행
answer++; // 새로운 네트워크 발견 시 증가
}
}
return answer;
}

 

 

각각의 BFS 연산을 할 때 마다 네트워크가 증가한다.

 

 

 

 

좀 더 간략화한 버젼

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int answer;
vector<int> visited;
void BFS(int start, int n, vector<vector<int>>& computers)
{
queue<int> Q;
Q.push(start);
visited[start] = 1; // 현재 컴퓨터 방문 표시
while (!Q.empty())
{
int curr = Q.front();
Q.pop();
for (int i = 0; i < n; i++)
{
if (!visited[i] && computers[curr][i] == 1) { // 연결된 컴퓨터 찾기
visited[i] = 1; // 방문 표시
Q.push(i); // 다음 컴퓨터를 큐에 추가
}
}
}
}
int solution(int n, vector<vector<int>> computers) {
visited.resize(n);
for (int i = 0; i < n; i++)
{
if (false == visited[i]) { // 방문하지 않은 컴퓨터 찾기
BFS(i, n, computers);
answer++; // 새로운 네트워크 발견 시 증가
}
}
return answer;
}