[백준] 2961 - 도영이가 만든 맛있는 음식 🍲 (Python) / 실버 2 / 브루트포스

반응형

BAEKJOON Logo

 

 

 

 

Contents

 


1.  문제🔥

링크: https://www.acmicpc.net/problem/2961

문제

요약하자면, 재료의 개수 N이 주어지고, 다음 N개의 줄 동안 각 재료가 갖는 신맛과 쓴맛을 입력받습니다. 1개 이상의 재료를 사용했을 때 각 재료의 신맛은 모두 곱해지고, 쓴맛은 모두 더해집니다. 이 때, 신맛과 쓴맛의 차이가 가장 작을 때를 출력하면 됩니다.

 

1) 예제 입출력❄️

예제 입출력

재료가 1개일 때입니다. 해당 재료만 고르면 되고, 신맛은 3이고 쓴맛은 10입니다. 그 차이는 7이므로, 7을 출력합니다.

 

2. 핵심 논리☢️

재료의 신맛, 쓴맛을 이중리스트로 받습니다. 재료에 대해 1개~N개를 선택하는 combination을 모두 고려하여, 각각 신맛 쓴맛의 차이를 result에 min으로 갱신하는 것이 핵심입니다.

 

3. 풀이 코드

1) 코드

from itertools import combinations
N=int(input()) # 재료의 개수 입력
materials=[list(map(int,input().split())) for _ in range(N)] # 재료의 신맛, 쓴맛 이중 리스트
result=1e9 # 10억으로 초기화
for cmbs in [combinations(materials,i) for i in range(1,N+1)]:
for c in cmbs:
S,B=1,0 # 신맛, 쓴맛 초기화
for s,b in c: # 각 조합에 대해
S*=s;B+=b # 신맛은 곱하고, 쓴맛은 더한다
result=min(result, abs(S-B)) # 최소값 갱신
print(result)

재료의 개수(N)을 입력받고, N번 반복하며 [신맛, 쓴맛]을 원소로 갖는 이중리스트 materials를 정의합니다. 최종 출력할 result를 10억(1e9)로 초기화 합니다. 그 이유는 처음에 문제에서 재료의 신맛과 쓴맛의 합은 최대 10억이라고 했는데, 그 차이는 그러면 10억 미만일 수 밖에 없기 때문입니다. 

 리스트컴프리헨션을 이용해 combinations에 대해 1개 선택하는 경우, ... N개 선택하는 경우를 모두 고려합니다. 각 조합에 대해 신맛과 쓴맛을 S와 B로 초기화 하고, cmbs를 c로 반복하며 신맛은 곱하고, 쓴맛은 더합니다. 해당 조합의 재료에 대해 신맛과 쓴맛의 차이는 abs(S-B)로 차이의 절대값을 구해줬습니다. 이를 result에 min으로 갱신하며 모든 경우에 대해 최소값이 result에 저장되도록 합니다.

 

읽어주셔서 감사합니다.

다음에 더욱 유익한 글로 찾아오겠습니다.

 

* 관련 풀이 코드는 아래 깃허브 링크에 있습니다.

https://github.com/netsus/BaekJoon/blob/master/jupyter/2961_%EB%8F%84%EC%98%81%EC%9D%B4%EA%B0%80_%EB%A7%8C%EB%93%A0_%EB%A7%9B%EC%9E%88%EB%8A%94_%EC%9D%8C%EC%8B%9D.ipynb

 

GitHub - netsus/BaekJoon: Algorithm Problem solving

Algorithm Problem solving. Contribute to netsus/BaekJoon development by creating an account on GitHub.

github.com

Reference)
1. BAEKJOON Logo: https://www.acmicpc.net/
반응형

댓글

Designed by JB FACTORY