문제 풀이/Programmers 문제 풀이
[Programmers]#Level3_네트워크, DFS, 깊이 우선 탐색
Hardii2
2024. 4. 15. 17:45
#1. 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#2. 풀이
1. 깊이 우선 탐색
[자료구조]#6_그래프
#0. 개념 1. 그래프? [정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와
webddevys.tistory.com
DFS(깊이 우선 탐색)은 그래프의 모든 정점을 탐색하는 방법 중 하나입니다. DFS는 출발 정점으로부터 더 이상 확장 불가능한 단말 노드까지 우선 탐색하는 방법입니다. 일반적으로, DFS는 재귀 호출 혹은 스택을 활용하여 구현합니다.
2. 모든 정점을 시작 정점으로 하여 DFS를 수행합니다!
- 주어진 2차원 벡터(computers)를 그래프로 가정하고, 각 컴퓨터를 시작 정점으로 하는 DFS를 수행합니다.
- 이때, DFS 수행 과정에서 각 컴퓨터의 방문여부를 체크해, 중복 방문을 방지해 줍니다.
#3. 코드
/*
@문제 : 네트워크를 형성하는 경로의 개수
@설명
1. 각 정점에 대하여 깊이 우선 탐색을 수행합니다.
2. 각 정점을 기준으로 깊이 우선 탐색을 수행하며 방문한 정점에 대하여 방문 여부를 체크합니다.
2. 방문 여부가 참인 정점은 이후 탐색 작업에서 제외되며, 다른 네트워크를 찾아냅니다.
*/
#include <string>
#include <vector>
using namespace std;
int network;
vector<bool> visited;
void dfs(int cur, vector<vector<int>> &graph)
{
visited[cur] = true;
for (int i = 0; i < (int)graph.size(); ++i)
{
if (i == cur)
continue;
if (graph[cur][i] != 0 && !visited[i])
{
dfs(i, graph);
}
}
}
int solution(int n, vector<vector<int>> computers)
{
visited.resize(n, false);
for (int i = 0; i < n; ++i)
{
if (!visited[i])
{
dfs(i, computers);
network++;
}
}
return network;
}