일단 info의 범위가 11개다.
중복 조합, 즉 완전 탐색으로 푼다면?
11개 중에 10개가 최악의 경우이기 때문에
그리고 그 안에서 루프가 11만큼 더 돌더라도 1847560이다.
- 중복 조합으로 11개의 과녁중 n개 만큼 맞추는 것을 루프로 돌린다.
1.1 주의해야 할 것은 10점부터 시작이 아닌 0점부터 시작이다.
1.2 왜냐면 점수차가 같더라도 가장 낮은 점수가 높은 것이 정답이기 때문이다.- 라이언의 점수가 어피치의 점수보다 높을 때만 서로의 차를 구해서 이전의 max_num로 저장된 값과 비교한다.
2.1 여기서 max_num은 이전의 라이언과 어피치의 점수 중 가장 높은 값이다.- 루프를 전부 돌고 나면 딕셔너리 형태로 답이 저장된다.
- 그 답을 루프를 돌면서 리스트에 넣어준다.
- 예외 값은 정답 딕셔너리가 비어있을 때에는 라이언이 어피치를 이길 수 없는 경우기 때문에 -1을 리턴해준다.
from itertools import combinations_with_replacement
from collections import Counter
def solution(n, info):
answer = dict()
score = [i for i in range(0, 11)]
apeech_dic = dict()
apeech_sum_num = 0
info.reverse()
for i in range(len(info)):
apeech_dic[i] = info[i]
if info[i] != 0:
apeech_sum_num += i
max_num = 0
for case in list(combinations_with_replacement(score, n)):
lion_dic = dict(Counter(case))
apeech_num = apeech_sum_num
lion_num = 0
for key, value in lion_dic.items():
if lion_dic[key] > apeech_dic[key]:
lion_num += key
if apeech_dic[key] != 0:
apeech_num -= key
if lion_num > apeech_num:
if max_num < lion_num - apeech_num:
max_num = lion_num - apeech_num
answer = lion_dic
result = []
if len(answer) == 0:
return [-1]
else:
for i in range(10, -1, -1):
if i not in answer:
result.append(0)
else:
result.append(answer[i])
return result
너무 재밌게 잘 읽었습니다 ~ ^.^