양궁대회

개발새발log·2022년 12월 4일
0

Programmers

목록 보기
27/35

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92342

접근 방법

👉 Brute-force (중복 조합 활용)

  1. 중복 조합을 활용해 라이언이 가질 수 있는 모든 점수 조합을 구한다.

  2. 가장 큰 점수 차이(라이언 총 점수 - 어피치 총 점수) 구하기

    • 라이언 총 점수 > 어피치 총 점수인 경우
  3. 만약 점수 차이가 같은 경우, 조건에 부합하는 점수 배열로 대체하기

다른 풀이 참고해보니..

3번 과정을 따로 할 필요없이, 애초에 더 큰 점수로 대체되게끔 라이언의 점수를 역순으로 초기화하면 2번으로 끝낼 수 있다 !

-> 가장 낮은 점수가 더 많이 오는 경우이므로

코드

from itertools import combinations_with_replacement


def get_score_diff(apeach_info, ryan_info):
    apeach_score, ryan_score = 0, 0
    for idx, (acnt, rcnt) in enumerate(zip(apeach_info, ryan_info)):
        if acnt == rcnt == 0:
            continue
        if acnt >= rcnt:
            apeach_score += (10 - idx)
        else:
            ryan_score += (10 - idx)

    return ryan_score - apeach_score if ryan_score > apeach_score else 0


def get_adequate_info(max_score_info, ryan_info):
    for x1, x2 in zip(reversed(max_score_info), reversed(ryan_info)):
        if x1 == x2 == 0:
            continue
        if x1 > x2:
            return max_score_info
        elif x1 < x2:
            return ryan_info


# 중복 조합 활용
def solution(n, info):
    max_score_diff = -float('inf')  # 가장 큰 점수 차
    max_score_info = []  # 가장 큰 점수 차일 때, ryan 의 점수 배열 기록 (max_score가 같은 경우, 비교하기 위해
    for combi in combinations_with_replacement(range(11), n):
        ryan_info = [0] * 11
        for idx in combi:
            ryan_info[idx] += 1  # ryan 이 맞힌 점수 배열

        cur_score_diff = get_score_diff(info, ryan_info)
        if cur_score_diff > 0:
            if max_score_diff < cur_score_diff:
                max_score_diff = cur_score_diff
                max_score_info = ryan_info
            elif max_score_diff == cur_score_diff:
                max_score_info = get_adequate_info(max_score_info, ryan_info)

    return [-1] if max_score_diff == -float('inf') else max_score_info

아무 생각없이 ryan이라고 했는데 생각해보니 lion같다.. 미안..🙄

profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글