Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/프로그래머스

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

    2021. 11. 19.

    by. Hyeon-Uk

    반응형

    https://programmers.co.kr/learn/courses/30/lessons/43162?language=java 

     

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

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

    programmers.co.kr


     

    풀이

    두가지 방법의 풀이가 있다. Union-Find 알고리즘을 사용하는 방법과 BFS를 사용하는 방법 두가지가 있다.

     

    1. Union-Find 알고리즘

    인접행렬로 주어진 정보를 이용해서 i!=j && computers[i][j]==1 이라면 두 컴퓨터 사이에는 네트워크로 연결이 된것이므로, i와 j를 Union 해준다.

     

    모든 노드들을 Union-Find 해준 뒤, 0~N-1번 노드를 탐색하며 큰 덩어리의 개수(i==parent[i] 인 노드의 개수) 를 세어준다.

     

    2. BFS

    모든 노드를 탐색하며, 탐색한 노드를 visited배열로 체크를 해주며, 방문하지 않은 노드이면서 현재 노드와 연결이 된 노드들을 탐색해준다. 모두 탐색을 하며 한번 BFS를 탐색할때마다 ANSWER+1을 해준다.

     

    코드

    1. Union-Find

    class Solution {
        static int parent[]=new int[200];
        public void init(int n){
            for(int i=0;i<n;i++) parent[i]=i;
        }
        public int find_parent(int c){
            if(c==parent[c]){
                return c;
            }
            else{
                return find_parent(parent[c]);
            }
        }
        public void union_parent(int a,int b){
            a=find_parent(a);
            b=find_parent(b);
            
            if(a>b){
                parent[a]=b;
            }
            else{
                parent[b]=a;
            }
        }
        public int solution(int n, int[][] computers) {
            int answer = 0;
            init(n);
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(i!=j && computers[i][j]==1){
                        union_parent(i,j);
                    }
                }
            }
            for(int i=0;i<n;i++){
                if(parent[i]==i) answer++;
            }
            return answer;
        }
    }

     

    2. BFS

    import java.util.*;
    class Solution {
        static boolean visited[]=new boolean[200];
        public void bfs(int node,int n,int[][] computers){
            Queue<Integer> q=new LinkedList<Integer>();
            q.offer(node);
            visited[node]=true;
            
            while(!q.isEmpty()){
                int now=q.poll();
                
                for(int i=0;i<n;i++){
                    if(i!=now && computers[now][i]==1 && !visited[i]){
                        q.offer(i);
                        visited[i]=true;
                    }
                }
            }
        }
        public int solution(int n, int[][] computers) {
            int answer = 0;
            for(int i=0;i<n;i++){
                if(!visited[i]){
                    bfs(i,n,computers);
                    answer++;
                }
            }
            return answer;
        }
    }
    반응형
    저작자표시 (새창열림)

    '문제풀이 > 프로그래머스' 카테고리의 다른 글

    [프로그래머스] 단어 변환  (0) 2021.11.21
    [프로그래머스] 타겟 넘버  (0) 2021.11.19
    [프로그래머스] 단속카메라  (0) 2021.11.01
    [프로그래머스] 가장 큰 정사각형 찾기  (0) 2021.10.10
    [프로그래머스] 동물 수 구하기  (0) 2021.09.05

    댓글

    관련글

    • [프로그래머스] 단어 변환 2021.11.21
    • [프로그래머스] 타겟 넘버 2021.11.19
    • [프로그래머스] 단속카메라 2021.11.01
    • [프로그래머스] 가장 큰 정사각형 찾기 2021.10.10
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바