알고리즘/프로그래머스

[프로그래머스]Lv2. 양궁대회(Python)

cha_eyoon 2024. 2. 29. 19:53

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 회고

 

<생각의 흐름>

중복 조합 라이브러리를 사용해서 n개의 화살을 쏴서 얻을 수 있는 라이언의 모든 점수의 조합을 생성한다.

조건에 의해 라이언은 어피치보다 더 많은 화살(초과)을 해당 점수에 맞혀야 점수를 얻는다.

라이언의 점수가 어피치의 점수보다 낮거나 같으면 [-1]을 반환

 

<코드의 흐름>

  1. 중복 조합 생성: n개의 화살을 쏴서 얻을 수 있는 모든 점수의 조합 생성 => 중복 허용
  2. 라이언의 점수 계산: 라이언은 어피치보다 더 많은 화살을 해당 점수에 맞혀야 점수 획득
  3. 어피치의 점수 계산: 어피치는 라이언이 같거나 적은 수의 화살을 해당 점수에 맞힌 경우 점수 획득
  4. 점수 차 계산: 라이언과 어피치의 점수 차 계산(max_gap 변수로 매 조합마다 갱신)
  5. 결과 반환: 최대 점수 차를 낸 화살 조합(max_gap) or 어떤 조합도 불가능하다면 초기값 반환 

 

코드
from itertools import combinations_with_replacement

def solution(n, info):
    answer = [-1]   # 이길 수 있는 방법이 없다면(조건)
    max_gap = -1    # 어피치와 라이언의 점수 차이 중 최대값
    
    # 0~11까지 n개의 숫자를 뽑는 모든 경우의 수 
    for combi in combinations_with_replacement(range(11), n):
        info2 = [0] * 11   # 라이언의 화살의 개수를 저장할 리스트
        # print(combi)    # (0, 0, 0, 0, 10)
        
        for i in combi:
            info2[10-i] += 1   # [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4]
        
        apeach, lion = 0, 0
        
        for i in range(11):
            # 어피치와 라이언이 모두 그 점수를 획득하지 못한 경우, 다음 점수로 pass
            if info2[i] == info[i] == 0:
                continue
            # 어피치가 라이언보다 많거나 같은 횟수로 그 점수를 획득한 경우, 어피치가 점수 획득
            elif info2[i] <= info[i]:
                apeach += (10-i)
            else:
                lion += (10-i)
        
        if lion > apeach:
            gap = lion-apeach
            
            # 최대 점수 차이 갱신, 라이언 화살 개수 answer에 담기
            if gap > max_gap:
                max_gap = gap
                answer = info2
    
    return answer