알고리즘(백준 등) 공부

SWEA 26390. 트리 바꾸기

posite 2026. 4. 3. 15:45

https://swexpertacademy.com/main/code/problem/problemDetail.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1<=n<=300000인 n에 대해서 n개의 정점과 n-1개의 간선으로 이루어진 트리를 모든 정점이 최대 2개의 서로 다른 정점과 연결되어 있는 체인으로 만드는데 필요한 작업의 수를 구하는 문제이다. 작업은 이미 연결된 정점 X, Y 를 골라 X와 Y 사이의 간선을 끊고, X에 연결되어 있지 않은 정점 Z를 골라 X와 Z를 연결한다.

 

정점에 대한 간선 정보를 통해 차수를 구한 후, 정점들이 2개까지만 갖게 절단하면 되므로 이 차수가 3개 이상인 정점들의 (차수 - 2)의 합을 구하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
		
        while (tc-- > 0) {
            int n = Integer.parseInt(br.readLine());
            int[] degree = new int[n + 1];

            for (int i = 0; i < n - 1; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                int u = Integer.parseInt(st.nextToken());
                int v = Integer.parseInt(st.nextToken());
                degree[u]++;
                degree[v]++;
            }

            long answer = 0;
            for (int i = 1; i <= n; i++) {
                if (degree[i] > 2) {
                    answer += degree[i] - 2;
                }
            }

            sb.append(answer).append('\n');
        }
        br.close();
        System.out.print(sb);
	}
}