728x90
순열조합
이터레이터 | 인자 | 결과 |
product() | p, q, … [repeat=1] | 데카르트 곱(cartesian product), 중첩된 for 루프와 동등합니다 |
permutations() | p[, r] | r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음 |
combinations() | p, r | r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음 |
combinations_with_replacement() | p, r | r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음 |
예 | 결과 |
product('ABCD', repeat=2) | AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD |
permutations('ABCD', 2) | AB AC AD BA BC BD CA CB CD DA DB DC |
combinations('ABCD', 2) | AB AC AD BC BD CD |
combinations_with_replacement('ABCD', 2) | AA AB AC AD BB BC BD CC CD DD |
풀이
from itertools import combinations_with_replacement
from collections import Counter
def solution(n, info):
max_diff, max_comb_cnt = 0, {}
for comb in combinations_with_replacement(range(11), n): # 조합
cnt = Counter(comb) # 각각 몇점짜리 맞췄는지
# 라이언, 어피치 점수 계산
r_score, a_score = 0, 0
for i in range(1, 11):
if info[10 - i] < cnt[i]: # 라이언 승
r_score += i
elif info[10 - i] > 0: # 어피치 승
a_score += i
diff = r_score - a_score
if diff > max_diff: # 최대 최종점수
max_comb_cnt = cnt
max_diff = diff
if max_diff > 0: # 이겼으면
answer = [0] * 11 # 10~1점까지
for n in max_comb_cnt:
answer[10 - n] = max_comb_cnt[n]
return answer
else:
return [-1]
728x90