백준 BOJ 16439 치킨치킨치킨
문제의 파이썬 python 풀이입니다.
https://www.acmicpc.net/problem/16439
문제
N명의 고리 회원들은 치킨을 주문하고자 합니다.
치킨은 총 M가지 종류가 있고 회원마다 특정 치킨의 선호도가 있습니다. 한 사람의 만족도는 시킨 치킨 중에서 선호도가 가장 큰 값으로 결정됩니다. 진수는 회원들의 만족도의 합이 최대가 되도록 치킨을 주문하고자 합니다.
시키는 치킨의 종류가 많아질수록 치킨을 튀기는 데에 걸리는 시간도 길어지기 때문에 최대 세 가지 종류의 치킨만 시키고자 합니다.
진수를 도와 가능한 만족도의 합의 최댓값을 구해주세요.
입력
첫 번째 줄에 고리 회원의 수 N (1 ≤ N ≤ 30) 과 치킨 종류의 수 M (3 ≤ M ≤ 30) 이 주어집니다.
두 번째 줄부터 N개의 줄에 각 회원의 치킨 선호도가 주어집니다.
i+1번째 줄에는 i번째 회원의 선호도가 주어집니다.
출력
첫 번째 줄에 고리 회원들의 만족도의 합의 최댓값을 출력합니다.
접근 : itertools.combinations
정석적인 풀이 방법은 치킨의 종류 M개 중에서 3개를 고르는 조합을 브루트포스로 전부 시도해 보는 것일 겁니다.
combinations
를 활용하면 좋겠습니다.
itertools.combinations
itertools
모듈의 combinations(iterable, r)
함수는
- 주어진
iterable
에서 r개를 뽑는 모든 조합을 만들어 줍니다. - 순서 상관없이 중복 없이 조합을 만듭니다.
- 반환되는 것은 튜플들의 이터레이터
사용 예시
from itertools import combinations
for comb in combinations(\[1, 2, 3, 4\], 2):
print(comb)
출력 결과
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
- 4개의 원소 중에서 2개씩 뽑는 모든 조합을 출력한 것!
풀이
# 16439 치킨치킨치킨
import sys
from itertools import combinations
input = sys.stdin.readline
n, m = map(int, input().split())
# 선호도 정보 저장
likes = [list(map(int, input().split())) for _ in range(n)]
max_total = 0
# 치킨 종류 중 3개 고르는 모든 조합
for comb in combinations(range(m), 3):
total = 0
for i in range(n):
# 회원 i의 선호도 중 선택된 3개 치킨에 대한 점수 중 최고값
max_like = max(likes[i][comb[0]], likes[i][comb[1]], likes[i][comb[2]])
total += max_like
max_total = max(max_total, total)
print(max_total)
likes [1] [3]
은 2번째 회원이 4번째 치킨에 대해 매긴 선호 점수에 해당할 것combinations(range(m), 3)
→ 치킨 종류 중 3개 고르기- 회원별로 3개 치킨 중 최고 선호도만 선택해서 총합 계산
- 모든 조합을 시도해서 최대값을 찾음
'Algorithm > Python' 카테고리의 다른 글
BOJ 23253 자료구조는 정말 최고야 (0) | 2025.04.17 |
---|---|
LeetCode 46 Permutations (0) | 2025.04.12 |
LeetCode 17 Letter Combinations of a Phone Number (0) | 2025.04.05 |
BOJ 16961 탭 vs 공백 (0) | 2025.04.05 |
BOJ 27162 Yacht Dice (0) | 2025.03.30 |