728x90
반응형
https://www.acmicpc.net/problem/1033
1033번: 칵테일
august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다. 경근이는 인터넷 검색을 통해서 재료 쌍 N
www.acmicpc.net
문제 해결
- 최소공배수를 이용해서 상대가격 비교
- 두 수(p,q)의 최소 공배수는 p*q//gcd(p,q) 이다.
- 상대 가격을 구한다음(P(2) =$\frac{P(1)}{i[1]} \times i[2] $) (i[1], i[2]는 1과 2의 상대 가격 비율) 모든 수의 최대공약수로 나누어서 출력한다.
CODE
n = int(input())
A = [[] for _ in range(n)]
visited = [False]*n
P = [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] #i는 (b,p,q)형태로 저장되어 있음
if not visited[next]:
P[next] = P[v]*i[2]//i[1] #v번째 상대가격을 이용한 next의 상대 가격
DFS(next)
for i in range(n-1):
a, b, p, q = map(int, input().split())
A[a].append((b,p,q)) #a가 p가격일 때 b는 q 가격
A[b].append((a,q,p)) #b가 q가격일 때 a는 p 가격
lcm *= ((p*q)//gcd(p,q))
P[0] = lcm
DFS(0)
mgcd = P[0] # 모든 수의 최대 공약수를 mgcd라 하자.(multi gcd)
for i in range(1,n):
mgcd = gcd(mgcd,P[i])
for i in range(n):
print(int(P[i]//mgcd), end=' ')
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1525 퍼즐 (0) | 2023.02.28 |
---|---|
[python] 백준 18352 특정 거리의 도시 찾기 (0) | 2023.02.26 |
[python] 백준 1850 최대공약수 (0) | 2023.02.24 |
[python] 백준 11689 GCD(n, k) = 1 (0) | 2023.02.24 |
[python] 백준 1747 소수&팰린드롬 (0) | 2023.02.23 |
댓글