DFS에 대한 두려움이 많이 줄어든것같다.
#include <string>
#include <vector>
using namespace std;
void dfs(vector<vector<int>>& computers, int i){
computers[i][i] = 0;
for(int k=0; k<computers.size(); k++){
if(computers[i][k] == 1 && computers[k][k] == 1) dfs(computers, k);
}
}
int solution(int n, vector<vector<int>> computers) {
int answer = 0;
for(int i=0; i<n; i++){
if(computers[i][i] == 1) {
dfs(computers, i);
answer++;
}
}
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/43162
코딩테스트 연습 - 네트워크
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있
programmers.co.kr
[접근]
DFS
https://jolly-note.tistory.com/62?category=993245
DFS (Depth First Search, 깊이 우선 탐색)
접근 graph 또는 tree를 탐색하는 알고리즘이다. 특정 노드부터 시작하여 최대한 멀리 갈 수 있을만큼 진행한다. 바로 전 분기점까지 돌아가고 아직 방문하지 않은 다음 노드로 진행한다. (방문한
jolly-note.tistory.com
[접근1]
컴퓨터에 방문한 여부는 computers[i][i]를 보면 알 수 있다.
따라서 0부터 n-1까지 돌면서 computers[i][i]가 1이면 dfs로 들어간다.
하나의 네트워크를 전부 돌고 나올것이기 때문에, answer를 1 증가시켜준다.
for(int i=0; i<n; i++){
if(computers[i][i] == 1) {
dfs(computers, i);
answer++;
}
}
[접근2] - dfs함수 내부
현재 컴퓨터의 방문 여부를 나타내기 위해 computers[i][i]를 0으로 만든다.
그리고 연결돼있는 컴퓨터들을 알기 위해서 0부터 computers.size()까지 돌면서('다른사람풀이'에서 computers.size()를 바깥으로 빼주라고한다.) 만약 연결되어있고, 연결돼있는 컴퓨터가 아직 방문 전이라면 dfs로 들어간다.
void dfs(vector<vector<int>>& computers, int i){
computers[i][i] = 0;
for(int k=0; k<computers.size(); k++){
if(computers[i][k] == 1 && computers[k][k] == 1) dfs(computers, k);
}
}'coding > algorithm' 카테고리의 다른 글
| [백준 && SW] gold5/D3 N-Queen (0) | 2022.05.27 |
|---|---|
| [백준/baekjoon] Silver1 2667. 단지번호붙이기 (0) | 2022.05.27 |
| [programmers] Lv.2 타겟 넘버(c++) (0) | 2022.05.24 |
| [SW Expert Academy] D2 1926. 간단한 369게임 (0) | 2022.05.24 |
| [SW Expert Academy] D2 1954. 달팽이 숫자 (0) | 2022.05.24 |
댓글