Algorithm

[백준 Silver 3] 9372 상근이의 여행 - Java

Ray 2022. 1. 3. 18:18

문제링크 : https://www.acmicpc.net/problem/9372

 

9372번: 상근이의 여행

첫 번째 줄에는 테스트 케이스의 수 T(T ≤ 100)가 주어지고, 각 테스트 케이스마다 다음과 같은 정보가 주어진다. 첫 번째 줄에는 국가의 수 N(2 ≤ N ≤ 1 000)과 비행기의 종류 M(1 ≤ M ≤ 10 000) 가

www.acmicpc.net

 

접근 과정 : 

  • 문제의 접근 방법은 크게 두가지라고 생각한다.
  • 먼저 지나가는 국가를 체크하면서 비행기를 타고, 모든 국가를 다 지나갔을 때, 비행기의 종류를 리턴하는 방법!
  • 그런데 여기에는 약간의 함정이 있다.
  • 국가를 여러번 지나가도 되고, 하나의 비행기를 여러번 타도 된다.!!
  • 즉, 비행기의 종류(간선)이 최소가 되게 모든 국가를 연결하는 것인데 이는 Tree 구조이다!!!
  • 따라서 다른 하나의 방법은 국가(노드)의 개수를 이용해서 비행기의 종류(간선)을 계산하는 것이다!!!

 

소스 코드 및 결과 :

package BOJ;

/* 
    상근이의 여행
    
    트리의 간선 = 노드 -1;
*/

import java.io.*;
import java.util.*;

public class BOJ9372 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
		int T = Integer.parseInt(br.readLine());
		
		StringBuilder sb = new StringBuilder();
		
		for (int i = 0; i<T; i++) {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());

            for (int j = 0; j<M; j++) {
                br.readLine();
            }

            sb.append(N-1).append("\n");

        }
		
		System.out.println(sb.toString());
    }
}

 

package BOJ;

/* 
    상근이의 여행
    
    직접 탐색
*/


import java.io.*;
import java.util.*;


public class BOJ9372_copy {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());

        while (T-- > 0) {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());

            List<List<Integer>> flight = new ArrayList<>();
            for(int i = 0 ;i<=N; i++){
                flight.add(new ArrayList<>());
            }

            while (M-- > 0) {
                st = new StringTokenizer(br.readLine());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());

                flight.get(a).add(b);
                flight.get(b).add(a);
            }

            boolean[] visit = new boolean[N + 1];

            sb.append(trip(flight, visit, 1)).append("\n");


        }

        System.out.println(sb.toString().trim());

    }

    static int trip(List<List<Integer>> flight, boolean[] visit, int now) {

        visit[now] = true;

        int fly = 0;

        for (int next : flight.get(now)) {
            if (visit[next]) {
                continue;
            }

            fly += (trip(flight, visit, next)+1);
        }

        return fly;
    }
}

 

P.S 

문제를 보고, 사용될 혹은 구성될 자료구조를 잘 파악하는게 주요 관점이지 않나 싶다.

나도.. 직접 탐색하는 알고리즘을 작성하고 나서 Tree 구조를 인지하게 되었다..

어쩐지 작성할 때, 이상하더라니..