-
[CodeKata] 프로그래머스 : 5.3(월), 네트워크Algorithm 2021. 5. 3. 16:24반응형
🥋 Oooth More!! (Level 3)
🧮 풀이
function solution(n, computers) { let answer = 0; let nodes = Array.from({ length: n }, (_,i) => i); let queue = []; while (nodes.length > 0) { if (queue.length === 0) { answer++; queue.push(nodes.shift()); } else { const now = queue.shift(); nodes.forEach(node => { if (computers[now][node] === 1) { queue.push(node); nodes = nodes.filter(e => e !== node); } }) } } return answer; }
- BFS(+queue) 를 활용한 풀이다. queue에 노드를 넣고, queue가 빌 때까지 인접 노드들을 계속 탐색하는 방법이다.
- nodes는 n(개수)을 인덱스들로 만든 배열, queue는 이 노드들을 탐색중에 임시저장할 저장소, answer는 네트워크 카운트 수다.
- nodes가 빌 때까지 while 반복문을 순회한다. queue가 빈 경우(새로운 네트워크 탐색), 있는 경우(인접 노드 검색) 2가지가 있다.
- 새로운 네트워크 탐색은, answer 개수를 먼저 1을 더해준다. 그리고, nodes의 노드 하나를 queue에 담아준다.
- 인접 노드 검색은, queue의 노드 하나를 꺼내온다. 다음, computers에서 이 노드와 연결된(1) 모든 노드를 queue에 담고 nodes에서 지운다. 이렇게 되면, 해당 else문이 종료된 다음에도 queue가 비어있지 않으므로 이 로직이 재실행된다. (인접노드 기준으로)
- 최종적으로, answer를 반환하면 된다.
🖇 리뷰
1) BFS 개선방법
위 풀이가 소요시간이 좀 더 짧았다. 아마, visitedNode를 true/false로 토글링하기 때문에, 배열가공이 최소화되지 않았나 싶다.
2) DFS 다른방법
이 문제는, DFS나 BFS 둘 중 아무 방법이나 사용해도 무방하다. 결국, 모든 노드를 탐색하기만 하면 되기 때문이다.
function solution(n, computers) { var answer = 0; const check = []; for(const computer of computers){ check.push(false); } function DFS(index){ check[index] = true; for(let i = 0; i< computers.length; i++ ){ if(computers[index][i] === 1 && !check[i]){ DFS(i); } } } for(let i = 0; i < computers.length; i++ ){ if(!check[i]){ DFS(i); answer+=1; } } return answer; }
check는 visitedNode와 같은 역할이다. (마찬가지로 true/false 토글링)
DFS() 함수는 인덱스를 인자로 받아, check의 현재 인덱스를 true로 변환하고 computers에서 다음 이동할 수 있는 인덱스를 재귀한다.
이를, for문을 통해 0부터 순회하며 현재 check가 false인 (방문하지 않은) 노드에서 DFS() 함수를 실행하면 된다.
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 코딩테스트 : 5.7(금), 문제풀이 (0) 2021.05.08 [CodeKata] 프로그래머스 : 5.4(화), 가장 먼 노드 (0) 2021.05.04 [CodeKata] 프로그래머스 : 5.1(토), 자물쇠와 열쇠 (0) 2021.05.01 [CodeKata] 프로그래머스 : 4.30(금), 2 x n 타일링 & N으로 표현 (0) 2021.04.30 [CodeKata] 프로그래머스 : 4.28(수), 추석 트래픽 (0) 2021.04.28