코테
프로그래머스) 네트워크(js)
devgenie
2024. 7. 2. 16:10
https://school.programmers.co.kr/learn/courses/30/lessons/43162
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
그래프가 주어졌을 때 간선으로 연결된 노드 묶음을 세는 문제이다.
섬이 되는 노드 묶음의 갯수를 파악하면 된다.
내가 짠 정답코드는 다음과 같다.
function solution(n, computers) {
var answer = 0;
let ch = Array.from({length : n}, ()=>0); // (1)
const DFS = (v, ch) => {
ch[v] = 1; // (3)
for(let i = 0; i < n; i++){
if(ch[i] === 0 && computers[v][i] === 1){ // (4)
DFS(i, ch);
}
}
}
for(let i = 0; i < ch.length; i++){
if(ch[i] === 1) continue; // (2)
answer++;
DFS(i, ch);
}
return answer;
}
깊이우선탐색(DFS) 을 이용하여 해결하였다.
코드의 주요 역할은 다음과 같다.
(1) 이미 방문한 노드를 체크하기 위한 ‘ch’ 배열을 생성하였다. 인덱스가 노드의 번호이고 0인 경우 미방문, 1인 경우 방문한 노드를 나타낸다.
(2) ‘ch[i]’ === 1 인 경우는 이미 방문한 노드이므로 현재 루프에서 countinu 한다.
(3) 현재 노드 i를 방문하였기 때문에 ch[i] = 1 을 할당한다.
(4) 해당 노드에서 깊이우선탐색을 하기 전에 ch[i]의 값을 통하여 이미 방문한 노드인지 아닌지 확인하고, 현재 노드에서 방문할 수 있는 노드인지 확인한다.
넓이우선탐색(BFS)나 UnionFind를 이용하여 푼 답안들도 있는 것 같은데, 기회가 되면 이러한 알고리즘을 이용하여 다시 풀어봐야겠다.