알고리즘 공부/문제 풀이

[프로그래머스] 탐욕 알고리즘 - 섬 연결하기

valid_ming 2020. 8. 18. 17:01

문제를 읽고 최소 스패닝 트리를 만드는 문제라는 것을 알았고

크루스칼 알고리즘을 이용하였다.

 

	static int solution(int n, int[][] costs) {
        int answer = 0;
        
        ArrayList<Integer> in=new ArrayList<>();
        int[][] adj = new int[n][n];	//인접한 섬들을 알려주는 배열, 0으로 초기화 상태
        
        for(int i = 0; i < costs.length; i++) {
        	//선은 양방향
            adj[costs[i][0]][costs[i][1]] = adj[costs[i][1]][costs[i][0]] = costs[i][2];
        }
        
        in.add(0);
        
        while(in.size()<n) {
        	int min=Integer.MAX_VALUE;
        	int minIdx=-1;
        	for(int i=0;i<in.size();i++) {      
        		int island=in.get(i);
        		for(int j=0;j<n;j++) {
        			// 연결할 섬이 in에 포함되어 있지 않고, 현재 island와 j가 연결됨(0이상 값), 중 가장 작은 값  
        			if(!in.contains(j) && adj[island][j]>0 && adj[island][j]<min) {
        				min=adj[island][j];
        				minIdx=j;
        			}
        		}
        	}
        	in.add(minIdx);	//섬 포함하기 (연결할 섬 = minIdx)
        	answer+=min;// 정답에 가중치 합하기
        }
        
        return answer;
    }

 

포함되어있는 섬들과 포함되어있지 않은 섬들로 나누어 주어

초기 0 섬을 포함시킨 후, 0과 연결된 섬 중 가장 가중치가 작은 섬을 포함한다.

모든 섬이 포함될 때까지 반복한다.