alorithm/programmers

[프로그래머스] 네트워크

Hannana. 2024. 8. 13. 01:55
728x90
반응형

 

 

문제 파악

-n개의 노드가 주어지고, n개의 노드와 연결 된 노드의 인덱스에 연결이 유효하면 1, 유효하지 않으면 0을 표시한다.

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.

접근 방법

💡

-DFS 통해 인접한 노드 순회하고, 인접 없으면 네트워크 끝.

그런 네트워크가 몇개인지 총 카운트 (DFS를 네트워크만큼 수행)

-2차원 배열의 형태로 주어지는 연결 값을 보고, 각 노드가 어디와 연결되었는지 먼저 파악한다.

 

-코드 작성의 원활함을 위해 셋 그래프를 인접 리스트 형태로 변환, O(n^2)

-start노드는 1번부터 시작, dfs가 끝나면 카운트 -연결되지 않은 노드는 한번의 dfs로 순회가 어려우므로 dfs 구문을 반복문으로 호출

-단, visited 셋에 존재하지 않을 경우에만 다시 한번 dfs 순회한다.

-DFS문제

 

코드 구현

import java.util.*;
class Solution {
    static int cnt=0;
    public int solution(int n, int[][] computers) {
        Set<Integer> visited = new HashSet<>();
        Map<Integer, ArrayList<Integer>> connect = new HashMap<>();
        for (int i=1;i<=n;i++) {
            connect.putIfAbsent(i, new ArrayList<>());
            for (int j=1;j<=n;j++) {
                if(computers[i-1][j-1]==1) {
                    connect.get(i).add(j);
                }
            }
        }
        for(int i=1;i<=n;i++) {
            if(!visited.contains(i)) {
                dfs(connect,i,visited);
                cnt++;
            }
        }
        return cnt;
    }
    public void dfs(Map<Integer, ArrayList<Integer>> connect,int start,Set<Integer> visited){
        visited.add(start);
        for(int node:connect.get(start)) {
            if(!visited.contains(node)) {
                dfs(connect,node,visited);
            }
        }
    }
}

 

배우게 된 점

  • 해당 문제에서 dfs의 리턴 구문은 별도로 필요 없다.
  • 노드는 1부터 시작이므로 이를 유의해서 데이터를 할당한다.
  • 연결 된 노드는 한번의 순회로 조회가 가능하지만, 이 문제는 네트워크가 몇개인지 세어야하므로 노드의 연결을 따라 dfs를 여러번 수행하고 리턴 후 카운트를 증가시킨다.

 

 

 

반응형

'alorithm > programmers' 카테고리의 다른 글

[LeetCode] Is Graph Bipartite?  (0) 2024.08.13
[LeetCode] Coin Change  (0) 2024.08.13
[프로그래머스] 단어 변환  (0) 2024.08.13
[프로그래머스] 타겟 넘버  (0) 2024.08.13
[프로그래머스] N-Queen  (0) 2024.08.13