-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
39-Munbin-Lee #160
39-Munbin-Lee #160
Conversation
๋ฐฑ์ค์ ๊ณผํ์ ์๋ฌธ๋น์จ๋ ๊ด์ฌ๋ถ์ผ๊ฐ ์ฌ๋์ด๊ตฐ์. ์๋๋ฉด ๋ฐฑ์ค์ด ์๋ฌธ๋น์จ๋ฅผ ์ด๋ป๊ฒ๋ ์ฌ๋ํ๊ฒ ๋ง๋๋๊ฑด๊ฐ.?๐ค |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
import sys
from collections import defaultdict
MAX = 1000000001
def input(): return sys.stdin.readline().rstrip()
N, M = map(int, input().split())
cost = defaultdict(lambda : int(1e9))
receipes = defaultdict(list)
for _ in range(N):
ingredient, ingredient_cost = input().split()
cost[ingredient] = int(ingredient_cost)
for _ in range(M):
result, receipe = input().split("=")
ingredients = receipe.split("+")
receipes[result].append(list((int(ingredient[0]), ingredient[1:]) for ingredient in ingredients))
def find_the_cheapest_cost(ingredient, receipes, cost, parent, cache):
# ๋ ์ํผ๋ ์๊ณ ์ด ์๋ ์์ ๊ฒฝ์ฐ -1์ ๋ฐํ
if len(receipes[ingredient]) == 0 and cost[ingredient] == int(1e9): return -1
# ์ ์กฐํ ์ ์์ ๊ฒฝ์ฐ ์ด ์ ๋ฐ์ ์์
if len(receipes[ingredient]) == 0: return cost[ingredient]
parent.add(ingredient)
for love_receipe in receipes[ingredient]:
accumulate = 0
flag = False
for (count, sub_ingredient) in love_receipe:
# ๋ง์ฝ, ๋ด๋ถ ์ฌ๋ฃ์ ๋ถ๋ชจ ์ฌ๋ฃ๊ฐ ๋ค์ด๊ฐ ๊ฒฝ์ฐ, ์ฌ์ดํด์ ๋ง๋๋ฏ๋ก ์ฌ์กฐ๋ฅผ ๊ทธ๋ง ๋
if sub_ingredient in parent:
flag = True
break
sub_ingredient_cost = min(MAX,find_the_cheapest_cost(sub_ingredient, receipes, cost, parent, cache))
# ๋ด๋ถ ์ฌ๋ฃ๋ฅผ ์ฌ์ง๋, ๋ง๋ค์ง๋ ๋ชปํ ๊ฒฝ์ฐ ์ ์กฐ๋ฅผ ๊ทธ๋ง ๋
if sub_ingredient_cost == -1:
flag = True
break
if sub_ingredient_cost == MAX: accumulate = MAX
else: accumulate += min(MAX,count * sub_ingredient_cost)
# for๋ฌธ ์์์ break๋ฅผ ํ์ง ์์์ ๊ฒฝ์ฐ, ์ฆ ๋ด๋ถ ์ฌ๋ฃ๋ฅผ ๋ชจ๋ ๊ตฌํ ์ ์๋ ๊ฒฝ์ฐ
else:
if cost[ingredient] == int(1e9) and accumulate > int(1e9): cost[ingredient] = MAX
elif cost[ingredient] == -1: cost[ingredient] = accumulate
else: cost[ingredient] = min(cost[ingredient], accumulate)
# ๋ง์ฝ ๋ด๋ถ ์ฌ๋ฃ์ ๋ถ๋ชจ ์ฌ๋ฃ๊ฐ ๋ค์ด์์ด์ ์ฌ์กฐ๋ฅผ ๋ชปํ ๊ฒฝ์ฐ -1์ ๋ฐํ ํจ
if flag and cost[ingredient] == int(1e9): cost[ingredient] = -1
parent.discard(ingredient)
return cost[ingredient]
print(find_the_cheapest_cost("LOVE", receipes, cost, {"LOVE"}, cache))
์ผ๋จ 1์๊ฐ ์งธ ์ด๊ธด ํ๋ฐ,
์ง๋ฌธ ๊ฒ์ํ ๋ฐ๋ก๋ฅผ ๋ค ํต๊ณผํ๋๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค์.
LOVE๋ถํฐ ์ฌ๋ฃ๋ฅผ ํ๊ณ ํ๊ณ ๊ฐ๋ฉด์ ๊ณ์ ์ต์ ๊ฐ์ ์ฐพ์๋๊ฐ๋ ๋ก์ง์ธ๋ฐ,
๋ฌธ๋น๋์ด ๋งํ์ จ๋ ๋ฐฉ๋ฒ์ด๋ค์.
๊ทผ๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ์ ๋๋๊ฑด์ง ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ
๋ฌธ๋น๋ ํ์ด ๋ณด๋ฉด์ ๋ค์ ํ์ด๋ณด๊ฒ ์ต๋๋ค....... ํ๊ฐ ๋๋ค์ ๐ ๐ ๐
๋ฌธ๋น๋ ํ์ด ๊ต์ฅํ ์ง๊ด์ ์ด๊ณ ์ ํ์ด๋ณด๋ค ํจ์ฌํจ์ฌํจ์ฌ ์ฝ๋ค์.
ํก์ํ์๋๋ค.
import sys
from collections import defaultdict
def input(): return sys.stdin.readline().rstrip()
N, M = map(int, input().split())
cost = defaultdict(lambda : int(1e9))
receipes = defaultdict(list)
for _ in range(N):
ingredient, ingredient_cost = input().split()
cost[ingredient] = int(ingredient_cost)
for _ in range(M):
result, receipe = input().split("=")
ingredients = receipe.split("+")
receipes[result].append(list((int(ingredient[0]), ingredient[1:]) for ingredient in ingredients))
def update_price(target, receipes, cost):
loop_flag = False
for receipe in receipes:
accumulate = 0
for (count, ingredient) in receipe:
if ingredient not in cost: break
accumulate += (count * cost[ingredient])
else:
if target not in cost or accumulate < cost[target]:
loop_flag = True
cost[target] = accumulate
return loop_flag
loop_flag = True
while loop_flag:
loop_flag = False
for target in receipes:
loop_flag |= update_price(target, receipes[target], cost)
print(min(1000000001,cost["LOVE"])) if "LOVE" in cost else print("-1")
์ ๋ฌธ์ ๋ฉฐ์น ๋์ ํํ์ด ํ ๋๋ฐ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ ํ
์คํธ ์ผ์ด์ค๋ ๋ชป ๋ง์ถ๊ฒ ์ด์ ๋๋ฌด ์ด๋ ต๋ค์ ์ด๊ฑฐ |
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1050
์๋ฌธ๋น์ ๊ฒ์ํด์ ๋์จ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์์ต๋๋ค.
โ๏ธ ์์๋ ์๊ฐ
1์๊ฐ
โจ ์๋ ์ฝ๋
๋ฌธ์ ์ค๋ช
์์ ์ ์ถ๋ ฅ์ ๋จผ์ ๋ณด๋ฉด ๋นจ๋ฆฌ ์ดํดํ ์ ์๋ค.
์ฌ๋ฃ์ ์ด๋ฆ์ ์ํ๋ฒณ์ด๋ฏ๋ก, ์ ํ์ง๊ฐ ํ๋๋ฐ์ ์๋ค.
dict
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ๋ค.๋ ์ํผ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฅํ ์ ์๋ค.
ex. [['LOVE', ['2WATER', '4HONEY', '2BEER']], ['BEER', ['1HOP', '3WATER', '1HOP']]]
defaultdict
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ฌผ์ฝ์ ํด๋นํ๋ ๋ ์ํผ๋ค์ ์ ์ฅํ๋ค.defaultdict['LOVE'] = [['2WATER', '4HONEY', '2BEER'], [...]]
defaultdict['BEER'] = [['1HOP', '3WATER', '1HOP'], [...]]
๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ ๋ฑํ ํน์ ๋ฌผ์ฝ์ ํด๋นํ๋ ๋ ์ํผ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ด 1๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฅํ๋ค.
์ด ๋ถ๋ถ์ ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์น ์ ๋ฐ์ ์์ ๊ฒ ๊ฐ๋ค.
๊ฐ ๋ฌผ์ฝ์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ง๊ด์ ์ด๋ค.
๋ ์ํผ์ ์๋ ๊ฐ ์ฌ๋ฃ์ ์ * ๊ฐ ์ฌ๋ฃ์ ๋น์ฉ์ ๋ํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๊ณ ๋ คํด์ผ ํ ์ ์ด ์๋ค.
๋ฌผ์ฝ์ ์ฌ๋ฃ๋ก ๋ค๋ฅธ ๋ฌผ์ฝ์ด ํฌํจ๋ ๊ฒฝ์ฐ์ด๋ค.
1๋ฒ ์์ ๋ฅผ ๋ณด๋ฉด LOVE์ ์ฌ๋ฃ์ BEER์ด ์๋ค.
๋ง์ฝ ์ฒ์ ๋ ์ํผ๋ถํฐ ์ฐจ๋ก๋๋ก
updatePrice()
๋ฅผ ํ๋ค๋ฉด,updatePrice('BEER')
์ ์์ ์updatePrice('LOVE')
์ดํ์ด๊ธฐ ๋๋ฌธ์LOVE์ ๋น์ฉ์ ๊ตฌํ ์ ์๋ค.
๊ทธ๋์ ์์์ ๋ ฌ์ฒ๋ผ ์์๋ฅผ ์ ํด์ ๊ตฌํด์ผํ๋? ์๊ฐํ๋ค๊ฐ ์ํธ ์ฐธ์กฐ ๋ฑ ๋ณต์กํ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ์๋ค.
๋ ์ํผ์ ๊ฐ์๋ ๊ณ ์ 50๊ฐ์ด๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๋ ์ํผ๋ฅผ ์ํํ๋ฉด์
updatePrice()
๋ฅผ ํ๋ค.๋ง์ฝ 1๊ฐ๋ผ๋ ํน์ ์ฌ๋ฃ์ ๋น์ฉ์ด ์ ๋ฐ์ดํธ(์๋ก ์๊ธฐ๊ฑฐ๋, ์ด์ ๋ณด๋ค ์ธ์ก๊ฑฐ๋)๋์๋ค๋ฉด
๋ค์ 50๊ฐ๋ฅผ ๋ชจ๋ ์ํํ๋ค.
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ด๋ฅผ ์ํด
updatePrice()
์ ๋ฐํ๊ฐ์bool
๋ก ๋ณ๊ฒฝํ์๋ค.๊ทธ๋ฆฌ๊ณ , ๋ฃจํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ณ์
loop
๋ฅผ or ์ฐ์ฐํ์ฌ ํ ๋ฒ์ด๋ผ๋ ์ ๋ฐ์ดํธ๋๋ฉด, ์ ์ฒด ๋ ์ํผ๋ฅผ ๋ค์ ์ํํ๋ค.ํน์ ์ด๋ฐ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค.
๊ฒฐ๊ณผ๊ฐ ์ ํด์ง๊ธฐ ์ ๊น์ง, ๊ฐ ๋ฃจํ๋ฅผ ๋ ๋๋ง๋ค ์ต์ 1๊ฐ์ ๋ฌผ์ฝ์ ๋น์ฉ์ ์ ๋ฐ์ดํธ๋๋ค.
๋ฐ๋ผ์, ๋ ์ํผ์ ๊ฐฏ์๋งํผ ๋ฃจํ๋ฅผ ๊ทธ๋ฅ ๋๋ฉด ๋๋ค.
์์ ๋ฐฉ๋ฒ๋ณด๋ค ์์ฃผ ์์ฃผ ์์ฃผ ์ด์ง ๋นํจ์จ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ์๊ฐ๋ง ํด๋ณธ ๋ฐฉ๋ฒ์ธ๋ฐ, ๋ ์ํผ๋ฅผ ํ์ฑํ ๋์ ์ฌ๋ฃ์ ์ฌ์ฉ์ฒ๋ฅผ ์ ์ฅํ๋ค.
1๋ฒ ์์ ๋ฅผ ์๋ก ๋ค๋ฉด,
references['WATER'] = ['LOVE', 'BEER']
references['HONEY'] = ['LOVE']
references['BEER'] = ['LOVE']
references['HOP'] = ['BEER']
์ด๋ ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ฐ ๋น์ฉ์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ๊ทธ ๋ ํผ๋ฐ์ค๋ฅผ
dict
์ ์ ์ฅํ๋ค.๊ทธ๋ฆฌ๊ณ ๊ทธ
dict
๋ฅผ ๋ค์ ์ํํ๊ณ , ๊ทธ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค๋ฅธdict
์ ์ ์ฅํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.์ด๋ก ์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด์ง๋ง ๊ตฌํํ๊ธฐ ๊น๋ค๋กญ๋ค.
๋ฌด์๋ณด๋ค๋ worst case์์๋ ํจ๊ณผ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๊ตฌํํด๋ณด์ง๋ ์์๋ค.
๐ ์ ์ฒด ์ฝ๋