Skip to content
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

21-Hwangyerin #92

Merged
merged 2 commits into from
Mar 13, 2024
Merged

21-Hwangyerin #92

merged 2 commits into from
Mar 13, 2024

Conversation

Hwangyerin
Copy link
Collaborator

@Hwangyerin Hwangyerin commented Mar 8, 2024

πŸ”— 문제 링크

Baekjoon | λ„μ˜μ΄κ°€ λ§Œλ“  λ§›μžˆλŠ” μŒμ‹

μ§€κΈˆ λ„μ˜μ΄μ˜ μ•žμ—λŠ” μž¬λ£Œκ°€ N개 μžˆλ‹€. λ„μ˜μ΄λŠ” 각 재료의 신맛 S와 쓴맛 Bλ₯Ό μ•Œκ³  μžˆλ‹€. μ—¬λŸ¬ 재료λ₯Ό μ΄μš©ν•΄μ„œ μš”λ¦¬ν•  λ•Œ, κ·Έ μŒμ‹μ˜ 신맛은 μ‚¬μš©ν•œ 재료의 μ‹ λ§›μ˜ 곱이고, 쓴맛은 합이닀.

μ‹œκ±°λ‚˜ μ“΄ μŒμ‹μ„ μ’‹μ•„ν•˜λŠ” μ‚¬λžŒμ€ λ§Žμ§€ μ•Šλ‹€. λ„μ˜μ΄λŠ” 재료λ₯Ό 적절히 μ„žμ–΄μ„œ μš”λ¦¬μ˜ 신맛과 μ“΄λ§›μ˜ 차이λ₯Ό μž‘κ²Œ λ§Œλ“€λ €κ³  ν•œλ‹€. 또, 물을 μš”λ¦¬λΌκ³  ν•  μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ—, μž¬λ£ŒλŠ” 적어도 ν•˜λ‚˜ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

재료의 신맛과 쓴맛이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬λ₯Ό λ§Œλ“œλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯
첫째 쀄에 재료의 개수 N(1 ≀ N ≀ 10)이 주어진닀. λ‹€μŒ N개 μ€„μ—λŠ” κ·Έ 재료의 신맛과 쓴맛이 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. λͺ¨λ“  재료λ₯Ό μ‚¬μš©ν•΄μ„œ μš”λ¦¬λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, κ·Έ μš”λ¦¬μ˜ 신맛과 쓴맛은 λͺ¨λ‘ 1,000,000,000보닀 μž‘μ€ μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯
첫째 쀄에 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬μ˜ 차이λ₯Ό 좜λ ₯ν•œλ‹€.


βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ


λ³€μˆ˜λͺ… 의미
sour 신맛
bitter 쓴맛
N 재료의 개수
idx 인덱슀
use 재료 μ‚¬μš©νšŸμˆ˜
recur μž¬κ·€μ˜ μ•½μž(ν•¨μˆ˜λͺ…)
result 신맛과 μ“΄λ§›μ˜ 차이
answer 쓴맛과 μ‹ λ§›μ˜ 차이의 μ΅œμ†Ÿκ°’

신맛과 μ“΄λ§›μ˜ 정도가 λ‚˜νƒ€λ‚˜λŠ” N개의 μž¬λ£Œλ“€μ€ 인덱슀λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄ 2μ°¨μ›λ¦¬μŠ€νŠΈλ‘œ λ§Œλ“€μ–΄μ€¬λ‹€.

ingredient = [list(map(int,input().split()))for _ in range(N)]

Note

각 재료의 신맛 S 와 쓴맛 B
신맛은 μ‚¬μš©ν•œ 재료의 μ‹ λ§›μ˜ 곱이고, 쓴맛은 ν•©
μž¬λ£ŒλŠ” 적어도 ν•˜λ‚˜ μ‚¬μš©
신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬

μš°λ¦¬κ°€ ꡬ해야 ν•˜λŠ” 건 각 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬μ΄λ‹€.

λ‹€μŒ κ·Έλ¦Όκ³Ό 같이 μ„€λͺ…ν•  수 μžˆλ‹€. (그림은 μž¬λ£Œκ°€ 세가지인 κ²½μš°μ΄λ‹€.)
재료λ₯Ό μ‚¬μš©ν•  κ²½μš°μ™€ μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우 두 κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.


DFS


XXX인 κ²½μš°μ—λŠ” λͺ¨λ“  μž¬λ£Œκ°€ μ‚¬μš©λ˜μ§€ μ•Šμ€ κ²½μš°μ΄λ‹€.


물을 μš”λ¦¬λΌκ³  ν•  μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ—, μž¬λ£ŒλŠ” 적어도 ν•˜λ‚˜ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

라고 λ¬Έμ œμ— λͺ…μ‹œλ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— returnν•΄μ€€λ‹€.

if use == 0:
            return

신맛과 μ“΄λ§›μ˜ 차이λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” abs() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
(= μ ˆλŒ“κ°’)

result = abs(sour-bitter)

재료λ₯Ό μ‚¬μš©ν•˜λŠ” 경우
sour(신맛)μ—λŠ” ν˜„μž¬ 재료의 신맛을 κ³±ν•˜κ³ , bitter(쓴맛)μ—λŠ” ν˜„μž¬ 재료의 쓴맛을 λ”ν•œλ‹€. 그리고 재료 μ‚¬μš©νšŸμˆ˜λ₯Ό 1증가 μ‹œν‚¨λ‹€.

recur(idx+1, sour*ingredient[idx][0], bitter+ingredient[idx][1],use+1)

재료λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우
sour(신맛)와 bitter(쓴맛)λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ³ , 재료 μ‚¬μš©νšŸμˆ˜λ„ μ¦κ°€μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

recur(idx+1 ,sour,bitter,use)

메인 μ½”λ“œμ— ν•¨μˆ˜κ°€ recur(0,1,0,0) 으둜 μ‹œμž‘ν•˜λŠ”μ΄μœ 
μš°μ„ , recur(idx, sour, bitter, use) μˆœμ„œμ΄λ‹€.
sourκ°€ 1둜 μ‹œμž‘ν•˜λŠ” μ΄μœ λŠ”

신맛은 μ‚¬μš©ν•œ 재료의 μ‹ λ§›μ˜ 곱이고, 쓴맛은 ν•©

이기 λ•Œλ¬Έμ΄λ‹€. 0으둜 μ‹œμž‘μ„ ν•˜κ²Œλ˜λ©΄ ν˜„μž¬ 신맛을 곱해도 계속 0으둜 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.
반면 쓴맛은 합이기 λ•Œλ¬Έμ— μ΄ˆκΈ°κ°’μ„ 0으둜 μ‹œμž‘ν•œλ‹€.


def recur(idx,sour, bitter, use):
    global answer

    if idx == N:
        if use == 0:
            return
        # 신맛 μ“΄λ§›μ˜ 차이(μ ˆλŒ“κ°’)
        result = abs(sour-bitter)
        # 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬μ˜ 차이
        answer = min(answer,result)
        print(result)
        return
    #재료λ₯Ό μ‚¬μš©ν•˜λŠ” 경우
    recur(idx+1, sour*ingredient[idx][0], bitter+ingredient[idx][1],use+1)
    #재료λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우
    recur(idx+1 ,sour,bitter,use)

# main
N = int(input())
ingredient = [list(map(int,input().split()))for _ in range(N)]
answer = 999999999

recur(0,1,0,0)
print(answer)

초기 μ΅œμ†Ÿκ°’μ„ μ΅œλŒ€ν•œ 큰 κ°’μœΌλ‘œ μž‘μ•„λ†“λŠ”λ‹€κ³  999999999둜 ν•΄λ†¨λŠ”λ°
μ΄ˆκΈ°κ°’μ„ μž‘μ„ λ•ŒλŠ” 주둜 μ–΄λ–€μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λ‚˜μš”?

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

DFS/BFS, λ°±νŠΈλž˜ν‚Ή, 트리

@9kyo-hwang
Copy link
Contributor

λ¬Έμ œλ§ˆλ‹€ λ‹€λ₯΄κΈ΄ ν•œλ°, 보톡은 단일값이 int λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•Šκ²Œμ£Όλ”λΌκ΅¬μš”.
987,654,321μ΄λ‚˜, 1,000,000,000μ΄λ‚˜, int max(μ•½ 21μ–΅)λ‚˜, 문제 쑰건에 따라 λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” μ΅œλŒ€κ°’ + 1을 주둜 μ£ΌλŠ” 것 κ°™μ•„μš”.
νŒŒμ΄μ¬μ—λŠ” float('inf') λΌλŠ” μ•ˆμ „ν•˜κ³  ν™•μ‹€ν•œ μ΅œλŒ€κ°’μ΄ μžˆμœΌλ‹ˆ 이거λ₯Ό μ‚¬μš©ν•˜μ‹œλŠ” κ±Έ ꢌμž₯ν•©λ‹ˆλ‹€ :)


이 λ¬Έμ œλŠ” 사싀상 λͺ¨λ“  쑰합을 ν™•μΈν•΄λ³΄λŠ” κ²ƒμ΄λ‹ˆ, 파이썬 itertools 라이브러리의 combinations ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ κ°„νŽΈν•˜κ²Œ 닡을 ꡬ할 수 μžˆλ‹΅λ‹ˆλ‹€.

from itertools import combinations

input = open(0).readline

N = int(input())
ingredients = [tuple(map(int, input().split())) for _ in range(N)]

ans = 10**9
for i in range(1, N + 1):
    for comb in combinations(ingredients, i):  # ingredients μš”μ†Œ 쀑에 i개λ₯Ό 골라본닀
        total_sour, total_bitter = 1, 0
        for sour, bitter, in comb:  # 이 쑰합에 μ†ν•œ μž¬λ£Œλ“€μ˜ 신맛, 쓴맛을 ν™•μΈν•œλ‹€
            total_sour *= sour
            total_bitter += bitter
            
        ans = min(ans, abs(total_sour - total_bitter))
        
print(ans)

@LJEDD2
Copy link
Collaborator

LJEDD2 commented Mar 12, 2024

ν—‰ float('inf') μ•Œλ €λ“œλ¦¬λ €κ³  ν–ˆλŠ”λ° κ΅ν™©λ‹˜μ΄ λ¨Όμ € λ‹¬μ•„μ£Όμ…¨κ΅°μš”~

Comment on lines +1 to +16
def recur(idx,sour, bitter, use):
global answer

if idx == N:
if use == 0:
return
# 신맛 μ“΄λ§›μ˜ 차이(μ ˆλŒ“κ°’)
result = abs(sour-bitter)
# 신맛과 μ“΄λ§›μ˜ 차이가 κ°€μž₯ μž‘μ€ μš”λ¦¬μ˜ 차이
answer = min(answer,result)
print(result)
return
#재료λ₯Ό μ‚¬μš©ν•˜λŠ” 경우
recur(idx+1, sour*ingredient[idx][0], bitter+ingredient[idx][1],use+1)
#재료λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우
recur(idx+1 ,sour,bitter,use)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 문제λ₯Ό 저도 ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€ !
재료의 κ°œμˆ˜κ°€ 정해지지 μ•Šκ³ , 1κ°œλΆ€ν„° nκ°œκΉŒμ§€ λͺ¨λ“  경우의 수λ₯Ό λ‹€ 봐야 ν•œλ‹€λŠ” μ μ—μ„œ 브루트포슀둜 ν•΄λ³Ό 수 μžˆκ² λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€!
λ”°λΌμ„œ combinationsλ₯Ό μ‚¬μš©ν•΄ 1λΆ€ν„° N개 μ„ νƒν•˜λŠ” κ²½μš°λ“€μ„ λ¦¬μŠ€νŠΈμ— λ‹΄μ•„μ£Όμ—ˆμŠ΅λ‹ˆλ‹€ !

combinations에 λŒ€ν•΄ 1개 μ„ νƒν•˜λŠ” 경우, ... N개 μ„ νƒν•˜λŠ” 경우λ₯Ό μ „λΆ€ κ³ λ €ν•˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³Ό μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€!

from itertools import combinations

for combis in [combinations(ingredient,i) for i in range(1,N+1)]:
    for combi in combis:
        S_result,B_result=1,0       # 신맛, 쓴맛 μ΄ˆκΈ°ν™”
        for s, b in combi: # 각 μ‘°ν•© 반볡 
            S_result*=s
            B_result+=b # 신맛은 κ³±ν•˜κ³ , 쓴맛은 더함 
        result=min(result, abs(S_result-B_result)) # μ΅œμ†Œ κ°±μ‹ 
print(result)

각 쑰합에 λŒ€ν•΄ 신맛과 쓴맛을 μ΄ˆκΈ°ν™” ν•˜κ³ , 신맛은 κ³±ν•˜κ³ , 쓴맛은 λ”ν•΄μ£ΌλŠ” 것을 λ°˜λ³΅ν•œλ’€ ν•΄λ‹Ή μ‘°ν•©μ˜ μž¬λ£Œμ— λŒ€ν•΄ 신맛과 μ“΄λ§›μ˜ 차이의 μ ˆλŒ“κ°’μ„ κ΅¬ν•΄μ€¬μŠ΅λ‹ˆλ‹€!

ALM λ‹€μ‹œ μ‹œλ™ κ±°λŠ” 쀑 .... 😭😭😭😭😭 λΉ μ΄νŒ…μž…λ‹ˆλ‹€

Copy link
Member

@janghw0126 janghw0126 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 μ •μ€λ‹˜μ²˜λŸΌ 재료의 μˆ˜κ°€ 적기 λ•Œλ¬Έμ— 브루트 포슀둜 풀어도 μΆ©λΆ„νžˆ κ°€λŠ₯ν•œ 문제라고 μƒκ°ν•΄μ„œ 1λΆ€ν„° NκΉŒμ§€ μ‘°ν•©μœΌλ‘œ λͺ¨λ“  경우λ₯Ό μ•Œμ•„λ‚΄κ³  λ‚œ λ‹€μŒ, κ²°κ³Όλ₯Ό μ—…λ°μ΄νŠΈν•˜μ˜€μŠ΅λ‹ˆλ‹€!
κ΅ν™©λ‹˜ 덕뢄에 float('inf') λΌλŠ” μ΅œλŒ“κ°’λ„ μžˆλ‹€λŠ” 것을 μ•Œμ•„κ°€λ„€μš”πŸ§ λ‹€μŒλΆ€ν„° μ΅œλŒ“κ°’μ„ μ‚¬μš©ν•  λ•Œ ν•œλ²ˆ μ‚¬μš©ν•΄λ³΄μ•„μ•Όκ² μŠ΅λ‹ˆλ‹€πŸ˜†

λ‹€μŒ PR도 νŒŸνŒ…μž…λ‹ˆλ‹Ή!πŸ‘Š

Copy link
Member

@avocado-13 avocado-13 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

였! 신맛은 0으둜 μ‹œμž‘ν•˜λ©΄ 뭐λ₯Ό 곱해도 0μ΄λ‹ˆ 1둜 μ‹œμž‘ν•΄μ•Όν•˜λŠ”κ΅°μš” :-D μž¬κ·€λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ collectionsλ‘œλ„ ν’€ 수 μžˆλ‹€λŠ” 것을 μ•Œμ•„κ°‘λ‹ˆλ‹€. 저도 μ΅œλŒ“κ°’μ΄ ν•„μš”ν•  λ•Œ 999999 이런 μ‹μœΌλ‘œ ν–ˆμ—ˆλŠ”λ° float('inf')κ°€ μžˆλ‹€λŠ” 것도 μ•Œμ•„κ°‘λ‹ˆλ‹€!

μ΄λ²ˆμ°¨μ‹œ PR 수고 λ§ŽμœΌμ…¨μŠ΅λ‹ˆλ‹· πŸ‘πŸ»βœ¨ πŸ‘πŸ»

@Hwangyerin Hwangyerin merged commit 1aca86d into AlgoLeadMe:main Mar 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants