쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 코딩테스트
  • 누적합
  • 자바
  • 부스트코스
  • 인프런
  • Spring Data JPA
  • 알고리즘
  • 백준
  • 백분
  • 위클리 챌린지
  • 타임리프
  • jpa
  • BFS
  • 스프링
  • spring
  • 구현
  • MVC
  • 비트마스킹
  • querydsl
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

네트워크
코딩테스트/[프로그래머스] 코딩테스트 연습

네트워크

2021. 7. 27. 20:56

문제 설명

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

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

 

제한사항

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

 

입출력 예

n computers return
3 [[1, 1, 0], [1, 1, 0], [0, 0, 1]] 2
3 [[1, 1, 0], [1, 1, 1], [0, 1, 1]] 1

 

입출력 예 설명

예제 #1
아래와 같이 2개의 네트워크가 있습니다.

예제 #2
아래와 같이 1개의 네트워크가 있습니다.

 

 


 

풀이 방법 생각

문제에서 각 네트워크를 묶기 위해 dfs(깊이우선탐색)을 이용해야겠다고 생각했다. dfs로 서로 연결되어 있는 네트워크를 찾으면 list에서 그 노드들을 제거하고 그렇게 list가 빌 때까지 반복하도록 했다.

 

내 코드

import java.util.ArrayList;

class Solution {
    public int solution(int n, int[][] computers) {
        int answer = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();

        for (int i = 0; i < n; i++) {
            list.add(i);
        }

        while (!list.isEmpty()) {
            int front = list.get(0);
            bfs(list, computers, front);
            list.remove((Integer) front);
            answer++;
        }

        return answer;
    }

    void dfs(ArrayList<Integer> list, int[][] computers, int num) {
        for (int i = 0; i < computers.length; i++) {

            if (list.contains(i) && (computers[num][i] == 1 || computers[i][num] == 1)) {

                list.remove((Integer) i);
                list.remove((Integer) num);

                bfs(list, computers, i);

            }
        }
    }
}

 

다른 사람 풀이

class Solution {
    public int solution(int n, int[][] computers) {
        int answer = 0;
        boolean[] chk = new boolean[n];
        for(int i = 0; i < n; i++) {
            if(!chk[i]) {
                dfs(computers, chk, i);
                answer++;
            }
        }
        return answer;
    }
    void dfs(int[][] computers, boolean[] chk, int start) {
        chk[start] = true;
        for(int i = 0; i < computers.length; i++) {
            if(computers[start][i] == 1 && !chk[i]) {
                dfs(computers, chk, i);
            }
        }
    }
}

각 노드들이 연결되어 있는지 확인할 때 boolean 배열을 이용해서 체크하는 방법을 사용했다. 반복할 때마다 false이고 연결되어 있다면 true값으로 변경해주는 방식이다. 

 

문제의 예시에는 서로 대칭형태로 주어져있어서 대칭으로 풀었더니 오류가 발생했었다. 문제에서 무조건 대칭이라는 조건도 없어서 대칭이 아닌 모든 경우를 계산해야 풀리는 문제였다. 

'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글

여행경로  (0) 2021.07.29
단어 변환  (0) 2021.07.28
주식가격  (0) 2021.07.26
다리를 지나는 트럭  (0) 2021.07.24
프린터  (0) 2021.07.22
    '코딩테스트/[프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
    • 여행경로
    • 단어 변환
    • 주식가격
    • 다리를 지나는 트럭
    쵼쥬
    쵼쥬

    티스토리툴바