녕의 학습 기록

백준_1033 칵테일 (유클리드 호제법) 본문

카테고리 없음

백준_1033 칵테일 (유클리드 호제법)

kjyyjk 2024. 2. 8. 13:12

 

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

public class BJ_1033_칵테일 {

    static boolean[] visited;
    static ArrayList<Node>[] arr;
    static long gcdResult;
    static long[] resultArr;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        arr = new ArrayList[n];
        visited = new boolean[n];
        resultArr = new long[n];

        for (int i=0; i<n; i++) {
            arr[i] = new ArrayList<Node>();
        }

        int a, b, i;
        long p, q;
        long lcm = 1;

        StringTokenizer st;
        for (i=0; i<n-1; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            p = Integer.parseInt(st.nextToken());
            q = Integer.parseInt(st.nextToken());

            arr[a].add(new Node(b, p, q));
            arr[b].add(new Node(a, q, p));

            lcm *= (p * q)/gcd(p, q); //해당하는 모든 비율의 최소공배수 구하기
        }

        resultArr[0] = lcm; // 임의의 노드에 최소공배수 저장하고

        dfs(0); // 임의의 노드 기준으로 모든 노드 값 구하기

        gcdResult = resultArr[0]; // 모든 값의 최대 공약수
        for(i=1; i<n; i++) {
            gcdResult = gcd(gcdResult, resultArr[i]);
        }

        StringBuilder sb = new StringBuilder();
        for(i=0; i<n; i++) {
            sb.append(resultArr[i]/gcdResult).append(' ');
        }

        System.out.println(sb);
    }

    static long gcd(long a, long b) { //유클리드 호제법
        if (b==0) {
            return a;
        }

        return gcd(b, a%b);
    }

    static void dfs(int node) {
        visited[node] = true;

        for (Node nextNode : arr[node]) {
            if (visited[nextNode.b] == false) {
                resultArr[nextNode.b] = resultArr[node] * nextNode.q / nextNode.p;
                dfs(nextNode.b);
            }
        }
    }

    static class Node {
        int b;
        long p;
        long q;

        public Node(int b, long p, long q) {
            this.b = b;
            this.p = p;
            this.q = q;
        }

    }

}

 

 

1033번: 칵테일

august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다.  경근이는 인터넷 검색을 통해서 재료 쌍 N

www.acmicpc.net