카카오배 양궁대회가 열렸습니다.라이언
은 저번 카카오배 양궁대회 우승자이고 이번 대회에도 결승전까지 올라왔습니다. 결승전 상대는 어피치
입니다.카카오배 양궁대회 운영위원회는 한 선수의 연속 우승보다는 다양한 선수들이 양궁대회에서 우승하기를 원합니다. 따라서, 양궁대회 운영위원회는 결승전 규칙을 전 대회 우승자인 라이언에게 불리하게 다음과 같이 정했습니다.
n
발을 다 쏜 후에 라이언이 화살 n
발을 쏩니다.과녁판은 아래 사진처럼 생겼으며 가장 작은 원의 과녁 점수는 10점이고 가장 큰 원의 바깥쪽은 과녁 점수가 0점입니다.
만약, k(k는 1~10사이의 자연수)점을 어피치가 a발을 맞혔고 라이언이 b발을 맞혔을 경우 더 많은 화살을 k점에 맞힌 선수가 k 점을 가져갑니다. 단, a = b일 경우는 어피치가 k점을 가져갑니다. k점을 여러 발 맞혀도 k점 보다 많은 점수를 가져가는 게 아니고 k점만 가져가는 것을 유의하세요. 또한 a = b = 0 인 경우, 즉, 라이언과 어피치 모두 k점에 단 하나의 화살도 맞히지 못한 경우는 어느 누구도 k점을 가져가지 않습니다.
모든 과녁 점수에 대하여 각 선수의 최종 점수를 계산합니다.
현재 상황은 어피치가 화살 n
발을 다 쏜 후이고 라이언이 화살을 쏠 차례입니다.라이언은 어피치를 가장 큰 점수 차이로 이기기 위해서 n
발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 구하려고 합니다.
화살의 개수를 담은 자연수 n
, 어피치가 맞힌 과녁 점수의 개수를 10점부터 0점까지 순서대로 담은 정수 배열 info
가 매개변수로 주어집니다. 이때, 라이언이 가장 큰 점수 차이로 우승하기 위해 n
발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 10점부터 0점까지 순서대로 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요. 만약, 라이언이 우승할 수 없는 경우(무조건 지거나 비기는 경우)는 [-1]
을 return 해주세요.
n
≤ 10info
의 길이 = 11info
의 원소 ≤ n
info
의 원소 총합 = n
info
의 i번째 원소는 과녁의 10 - i
점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)n
n
(꼭 n발을 다 쏴야 합니다.)10 - i
점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)[2,3,1,0,0,0,0,1,3,0,0]
과 [2,1,0,2,0,0,0,2,3,0,0]
를 비교하면 [2,1,0,2,0,0,0,2,3,0,0]
를 return 해야 합니다.[0,0,2,3,4,1,0,0,0,0,0]
과 [9,0,0,0,0,0,0,0,1,0,0]
를 비교하면[9,0,0,0,0,0,0,0,1,0,0]
를 return 해야 합니다.[-1]
을 return 해야 합니다.n | info | result |
---|---|---|
5 | [2,1,1,1,0,0,0,0,0,0,0] | [0,2,2,0,1,0,0,0,0,0,0] |
1 | [1,0,0,0,0,0,0,0,0,0,0] | [-1] |
9 | [0,0,1,2,0,1,1,1,1,1,1] | [1,1,2,0,1,2,2,0,0,0,0] |
10 | [0,0,0,0,0,0,0,0,3,4,3] | [1,1,1,1,1,1,1,1,0,0,2] |
from itertools import combinations_with_replacement
def solution(n, info):
answer = [-1]
# ryan의 화살 개수 후보군
candidate = list(combinations_with_replacement(range(0,11),n))
MAX = -1e9
for c in candidate:
r_info = [0] * 11
for s in c:
r_info[10-s] += 1
# apeach vs ryan 의 점수 (idx가 곧 점수 의미 10-idx)
apeach ,ryan = 0,0
for idx , (a,r) in enumerate(zip(info,r_info)):
if a == 0 and r == 0 :
continue
elif a >= r:
apeach += (10 - idx)
elif a <= r:
ryan += (10 - idx)
if ryan > apeach:
sub = ryan - apeach
if sub > MAX: # 가장 큰 점수차로 이겨야 한다
MAX = sub
answer = r_info
return answer
주요 로직
ryan의 후보군 구하기
combinations_with_replacement(range,중복허용 개수)
즉 r_info
배열에 값을 할당할 수 있는 index의 가짓수를 보여준것
MAX로 값 비교해가며 update하기