알고리즘/코딩테스트

프로그래머스 네트워크

호두밥 2021. 10. 12. 00:20

문제 : https://programmers.co.kr/learn/courses/30/lessons/43162

 

코딩테스트 연습 - 네트워크

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있

programmers.co.kr

 

풀이 : BFS를 이용해 지점을 잇는 경로를 탐색

① 지점을 잇는 경로를 탐색한다.

② ①에서 탐색되지 않은 지점를 시작으로 재탐색한다.

* computer[i][i] 가 1이므로, 어느 지점과 연결되지 않으면 자기자신하고만 연결되는 경로 (네트워크) 1개가 세어진다.

2021.09.19 - [알고리즘/알고리즘] - 너비 우선 탐색 Breath-first Search BFS

 

너비 우선 탐색 Breath-first Search BFS

너비 우선 탐색 시작점에서 도달 가능한 모든 간선을 탐색하여 찾는 과정 탐색을 하면서 시작점으로부터 거리를 계산한다. 탐색을 하면서 직전 정점의 위치를 저장한다. (거쳐온 정점을 기록한

mantaray.tistory.com

 

구현 JAVA

import java.util.*;

class Solution {
       public int solution(int n, int[][] computers) {
    	
    	boolean[] visited = new boolean[n];
    	int network = 0;

    	for(int i = 0; i<n; i++) {
    		if(visited[i]) {
    			continue;
    		}else {
    			bfs(i, computers, visited);
    			network++;
    		}
    	}
        return network;
    }
	
    public void bfs(int now, int[][] computers, boolean[] visited) {
 
    	Queue<Integer> q = new LinkedList<Integer>(); //경로를 저장할 queue
    	visited[now] = true;// 현재 방문 여부를 지정
    	q.add(now); //현재 위치를 경로에 저장
    	
    	while(q.size()>0) { 
    		//현재 위치를 경로에서 추출
    		now = q.poll();
    		//현재 위치와 이어져 있는 지점을 탐색
    		for(int i = 0; i<computers.length; i++) {
    			//방문한 지점이 방문한 적이 없다면 지점을 저장
    			if(!visited[i] && computers[now][i] == 1) {
    				visited[i] = true;
    				q.add(i);
    			}
    		}
    	}
    }
}