• Baekjoon 18243 Small World Network JAVA

    2022. 5. 22.

    by. 순일

     

    18243번: Small World Network

    첫 번째 줄에 지구에 있는 사람의 수 N과 친구 관계의 개수 K가 주어진다. 모든 사람은 1부터 N까지 번호가 매겨져 있다. (1 ≤ N ≤ 100, 0 ≤ K ≤ N×(N-1)/2) 두 번째 줄부터 K+1번째 줄까지 친구

    www.acmicpc.net

    문제

    작은 세상 네트워크(Small World Network)란 Milgram 교수가 1967년에 처음으로 밝혀낸 이론이다.

    간단히 설명하자면 전체 네트워크가 거대하더라도 전체가 서로 가깝게 연결될 수 있다는 이론이다.

    해당 이론에서 Milgram 교수는 지구에 있는 모든 사람들이 최대 6단계로 연결될 수 있다고 주장하였다.

    예를 들어 이 문제를 만든 김 모 씨(23)와 이지은님(27)이 서로 생판 모르는 관계라도 최대 6단계만 거치면 서로 연결이 되어있다는 것이다.

    위의 그림에서 정점은 사람, 간선은 친구 관계라 할 때 왼쪽 그래프의 모든 정점들은 서로 최소 6단계 이하로 연결되어 있으므로 작은 세상 네트워크를 만족한다. 그러나 오른쪽 그래프의 초록색 정점끼리는 최소 7단계를 거쳐서 연결되어 있으므로 작은 세상 네트워크를 만족하지 않는다. 

    이 이론에 대해 의구심이 생긴 김 모 씨는 정말 최대 6단계만 거치면 지구상의 모든 사람들이 서로 연결이 될 수 있는지 확인하고 싶었다.

    김 모 씨를 위해 지구상의 모든 사람들의 친구 관계가 주어졌을 때 작은 세상 네트워크가 실제로 만족하는지 확인하는 프로그램을 만들어보자.

    조건

    [입력]

    첫 번째 줄에 지구에 있는 사람의 수 N과 친구 관계의 개수 K가 주어진다. 모든 사람은 1부터 N까지 번호가 매겨져 있다. (1 ≤ N ≤ 100, 0 ≤ K ≤ N×(N-1)/2)

    두 번째 줄부터 K+1번째 줄까지 친구 관계를 나타내는 A B가 한 줄에 하나씩 주어진다. (1 ≤ A, B ≤ N)

    A와 B가 친구면 B와 A도 친구다. 자기 자신과 친구인 경우는 없다. A와 B의 친구 관계는 중복되어 입력되지 않는다.

    [출력]

    해당 네트워크가 작은 세상 네트워크를 만족하면 "Small World!"를, 만족하지 않는다면 "Big World!"를 출력한다.

    풀이

    해당 문제는 그냥 플로이드 와샬을 이용하면 쉽게 해결 가능한 문제였다. 입력값을 처리해주고 난 뒤 플로이드 와샬 알고리즘을 적용하고 그 결과 배열에 대해서 값을 체크하여 6 이상인 값이 있다면 실패 아닌 경우 성공으로 처리하여주면 된다.

    코드
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	public static void main(String[] args) throws Exception{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		int N = Integer.parseInt(st.nextToken());
    		int K = Integer.parseInt(st.nextToken());
    		int[][] arr = new int[N][N];
    		for (int i = 0; i < arr.length; i++) {
    			for (int j = 0; j < arr.length; j++) {
    				if(i != j)
    					arr[i][j] = 1000; // 배열을 max 값으로 갱신
    			}
    		}
    		for (int i = 0; i < K; i++) { // 관계를 0부터 시작으로 처리하기위해 -1
    			st = new StringTokenizer(br.readLine());
    			int a = Integer.parseInt(st.nextToken()) -1;
    			int b = Integer.parseInt(st.nextToken()) -1;
    			arr[a][b] = arr[b][a] = 1;
    		}
    		for (int k = 0; k < arr.length; k++) { // 플로이드 와샬 적용
    			for (int i = 0; i < arr.length; i++) {
    				if( i == k)
    					continue;
    				for (int j = 0; j < arr.length; j++) {
    					if(i == j || k == j)
    						continue;
    					arr[i][j] = Math.min(arr[i][j], arr[i][k] + arr[k][j]);
    				}
    			}
    		}
    		for (int i = 0; i < arr.length; i++) { // 결과값 체크
    			for (int j = 0; j < arr.length; j++) {
    				if(arr[i][j] > 6) { // 출력후 종료
    					System.out.println("Big World!");
    					System.exit(0);
    				}
    			}
    		}
    		System.out.println("Small World!");
    	}
    }

     

     

    GitHub - JUNGSOONIL/Algorithm-JAVA: 알고리즘 문제 해결 자바 소스 코드

    알고리즘 문제 해결 자바 소스 코드. Contribute to JUNGSOONIL/Algorithm-JAVA development by creating an account on GitHub.

    github.com

     

    728x90

    '알고리즘 > Baekjoon' 카테고리의 다른 글

    Baekjoon 4803 트리 JAVA  (0) 2022.05.27
    Baekjoon 2615 오목 JAVA  (0) 2022.05.23
    Baekjoon 19583 싸이버개강총회 JAVA  (0) 2022.05.21
    Backjoon 11123 양 한마리... 양 두마리... JAVA  (0) 2022.05.20
    Baekjoon 11652 카드 JAVA  (0) 2022.05.19

    댓글