[프로그래머스] 양궁대회

최동혁·2022년 12월 11일
0

프로그래머스

목록 보기
26/68

풀이 방법

일단 info의 범위가 11개다.
중복 조합, 즉 완전 탐색으로 푼다면?
nHr=n+r1Cn1_nH_r = _{n+r-1}C_{n-1}
11개 중에 10개가 최악의 경우이기 때문에
11H10=20C10=184756_{11}H_{10} = _{20}C_{10} = 184756
그리고 그 안에서 루프가 11만큼 더 돌더라도 1847560이다.

  1. 중복 조합으로 11개의 과녁중 n개 만큼 맞추는 것을 루프로 돌린다.
    1.1 주의해야 할 것은 10점부터 시작이 아닌 0점부터 시작이다.
    1.2 왜냐면 점수차가 같더라도 가장 낮은 점수가 높은 것이 정답이기 때문이다.
  2. 라이언의 점수가 어피치의 점수보다 높을 때만 서로의 차를 구해서 이전의 max_num로 저장된 값과 비교한다.
    2.1 여기서 max_num은 이전의 라이언과 어피치의 점수 중 가장 높은 값이다.
  3. 루프를 전부 돌고 나면 딕셔너리 형태로 답이 저장된다.
  4. 그 답을 루프를 돌면서 리스트에 넣어준다.
  5. 예외 값은 정답 딕셔너리가 비어있을 때에는 라이언이 어피치를 이길 수 없는 경우기 때문에 -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
profile
항상 성장하는 개발자 최동혁입니다.

2개의 댓글

comment-user-thumbnail
2022년 12월 11일

너무 재밌게 잘 읽었습니다 ~ ^.^

1개의 답글