From a3a8fad7c106ee4420e972657e6ac069ea61321c Mon Sep 17 00:00:00 2001 From: SSUM <116950962+ssum21@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:15:40 +0900 Subject: [PATCH] =?UTF-8?q?[Gold=20II]=20Title:=20=EC=B9=B5=ED=85=8C?= =?UTF-8?q?=EC=9D=BC,=20Time:=2044=20ms,=20Memory:=2034536=20KB=20-Baekjoo?= =?UTF-8?q?nHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 백준/Gold/1033. 칵테일/README.md | 36 ++++++++++++++++++++++++++ 백준/Gold/1033. 칵테일/칵테일.py | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 백준/Gold/1033. 칵테일/README.md create mode 100644 백준/Gold/1033. 칵테일/칵테일.py diff --git a/백준/Gold/1033. 칵테일/README.md b/백준/Gold/1033. 칵테일/README.md new file mode 100644 index 0000000..d05a375 --- /dev/null +++ b/백준/Gold/1033. 칵테일/README.md @@ -0,0 +1,36 @@ +# [Gold II] 칵테일 - 1033 + +[문제 링크](https://www.acmicpc.net/problem/1033) + +### 성능 요약 + +메모리: 34536 KB, 시간: 44 ms + +### 분류 + +유클리드 호제법, 그래프 이론, 그래프 탐색, 수학, 정수론 + +### 제출 일자 + +2025년 2월 25일 18:15:23 + +### 문제 설명 + +

august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다.

+ +

경근이는 인터넷 검색을 통해서 재료 쌍 N-1개의 비율을 알아냈고, 이 비율을 이용해서 칵테일에 들어가는 전체 재료의 비율을 알아낼 수 있다.

+ +

총 재료 쌍 N-1개의 비율이 입력으로 주어진다. 이때, 칵테일을 만드는데 필요한 각 재료의 양을 구하는 프로그램을 작성하시오. 이때, 필요한 재료의 질량을 모두 더한 값이 최소가 되어야 한다. 칵테일을 만드는 재료의 양은 정수이고, 총 질량은 0보다 커야한다.

+ +

비율은 "a b p q"와 같은 형식이고, a번 재료의 질량을 b번 재료의 질량으로 나눈 값이 p/q라는 뜻이다.

+ +### 입력 + +

첫째 줄에 august14를 만드는데 필요한 재료의 개수 N이 주어지며, N은 10보다 작거나 같은 자연수이다.

+ +

둘째 줄부터 N-1개의 줄에는 재료 쌍의 비율이 한 줄에 하나씩 주어지는데, 문제 설명에 나온 형식인 "a b p q"로 주어진다. 재료는 0번부터 N-1까지이며, a와 b는 모두 N-1보다 작거나 같은 음이 아닌 정수이다. p와 q는 9보다 작거나 같은 자연수이다.

+ +### 출력 + +

첫째 줄에 칵테일을 만드는데 필요한 각 재료의 질량을 0번 재료부터 순서대로 공백으로 구분해 출력한다.

+ diff --git a/백준/Gold/1033. 칵테일/칵테일.py b/백준/Gold/1033. 칵테일/칵테일.py new file mode 100644 index 0000000..704bdd2 --- /dev/null +++ b/백준/Gold/1033. 칵테일/칵테일.py @@ -0,0 +1,43 @@ +import sys +import math + +sys.setrecursionlimit(10**6) + +input = sys.stdin.readline + +N = int(input()) + +A = [[] for i in range(N)] +visited = [False] * (N) +D = [0] * (N) +lcm = 1 + +def gcd(a,b): + if b==0: + return a + else: + return gcd(b, a%b) + +def DFS(v): + visited[v] = True + for i in A[v]: + next = i[0] + if not visited[next]: + D[next] = D[v] * i[2] // i[1] + DFS(next) + +for i in range(N-1): + a, b, p, q = map(int, input().split()) + A[a].append((b, p, q)) + A[b].append((a, q, p)) + lcm *= (p*q // gcd(p, q)) + +D[0] = lcm +DFS(0) +mgcd = D[0] + +for i in range(1, N): + mgcd = gcd(mgcd, D[i]) + +for i in range(N): + print(int(D[i]//mgcd), end=' ') \ No newline at end of file