https://school.programmers.co.kr/learn/courses/30/lessons/43162
문제 설명
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
제한사항
• 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
• 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
• i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
• computer[i][i]는 항상 1입니다.
예제
n | computers | return |
3 | [[1,1,0],[1,1,0],[0,0,1]] | 2 |
3 | [[1,1,0],[1,1,1],[0,0,1]] | 1 |
내 풀이
이 문제는 그래프를 그려 연결되어있는 그래프의 갯수를 구해야 하므로, 연결된 노드들을 따라서 탐색을 하다가 연결이 끊기면 하나의 네트워크가 끝난것으로 다른 노드를 찾아 계속 찾는 DFS로 구현해보았다.
int answer = 0;
vector<bool> visited(n, false);
for(int i = 0; i < n; i++)
{
if(visited[i] == false)
{
DFS(computers, visited, i, n);
answer++;
}
}
일단 해당 컴퓨터의 방문여부를 체크하는 visited Vector와 네트워크의 갯를 저장하는 변수 answer를 만들어준다.
그리고 컴퓨터들의 방문여부를 체크한다.
- 만약 해당 컴퓨터를 방문한적 없으면
- 또하나의 네트워크 이므로 answer의 갯수를 1 늘려준다.(answer++)
- DFS탐색을 돌려준다(DFS(컴퓨터 연결정보 Vector, 방문여부 Vector, 현제 노드, 컴퓨터 갯수))
void DFS(vector<vector<int>>& computers, vector<bool>& visited, int index, int n)
{
visited[index] = true;
for(int i = 0; i < n; i++)
{
if (visited[i] == false && computers[index][i] == 1)
DFS(computers, visited, i, n);
}
}
일단 현제 노드(컴퓨터)를 방문처리 해주고 방문한적이 없고 서로 연결이되어있는 노드들을 찾아 재귀를 돌려준다.
return answer;
이렇게 총 네트워크의 갯수를 반환시켜주면 된다.
전체 코드
#include<iostream>
#include <vector>
using namespace std;
void DFS(vector<vector<int>>& computers, vector<bool>& visited, int index, int n)
{
visited[index] = true;
for(int i = 0; i < n; i++)
{
if (visited[i] == false && computers[index][i] == 1)
DFS(computers, visited, i, n);
}
}
int solution(int n, vector<vector<int>> computers)
{
int answer = 0;
vector<bool> visited(n, false);
for(int i = 0; i < n; i++)
{
if(visited[i] == false)
{
DFS(computers, visited, i, n);
answer++;
}
}
return answer;
}
결론
깊이 우선 탐색을 한층 더 깊이 이해하게 되었다.
'프로그래밍 > C++' 카테고리의 다른 글
C++ 포인터 (0) | 2024.01.20 |
---|---|
[C++]그리디 알고리즘(Greedy Algorithm) (0) | 2023.12.18 |
[프로그래머스/C++] 신고 결과 받기 (1) | 2023.11.22 |
[알고리즘/C++] 이진 탐색 트리 (Binary Search Tree, BST) (2) | 2023.11.08 |
[Algorithm] DFS와 BFS (2) | 2023.10.11 |