728x90
😉 아이디어
1. _!어피치를 이겨야하는 경우!_or _!져야하는 경우!_로 구분 경우의 수 배열 저장
2. 각 경우를 순회하며 화살의 개수를 고려, _!나의 점수!_및 _!어피치의 점수!_ 계산
3. 문제 내의 다양한 예외조건 분기처리
😉 풀이
combinations = []
def solution(n, info):
answer = []
# true, false 조합
for i in range(0, 12):
combination([0] * 11, 0, 0, i)
max_gap = -1
max_case = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for co in combinations:
arrows = n
apc_tt = 0
ryn_tt = 0
case = []
for i in range(0, 11):
isBigger = co[i]
apc_arw = info[i]
score = 10 - i
# 더 많이 맞춰야하고 화살이 충분할 때
if isBigger and arrows > apc_arw:
ryn_arw = apc_arw + 1
arrows -= ryn_arw
ryn_tt += score
case.append(ryn_arw)
continue
# 더 많이 맞춰야하지만 화살이 부족 or 더 많이 맞춰야하지 않고 어피치는 맞춘 경우
if (isBigger and arrows <= apc_arw) or (isBigger == 0 and apc_arw > 0):
apc_tt += score
if i == 10 and arrows > 0:
case.append(arrows)
else:
case.append(0)
# print('어피치의 점수 : ' + str(apc_tt) + ' | 라이언의 점수 : ' + str(ryn_tt))
gap = ryn_tt - apc_tt
if max_gap < gap:
max_gap = gap
max_case = case
elif max_gap == gap:
# 점수 차이가 동일할 경우 가장 낮은 점수를 더 많이 맞춘 경우가 정답
for i in range(10, -1, -1):
if max_case[i] > case[i]:
break
elif max_case[i] < case[i]:
max_case = case
# 어피치를 이길 수 없는 경우 or 무승부
if max_gap < 1:
return [-1]
return max_case
def combination(arr, start, cnt, limit):
global combinations
if cnt == limit:
combinations.append(arr)
return
for i in range(start, 11):
arr[i] = 1
combination(arr.copy(), i + 1, cnt + 1, limit)
arr[i] = 0
✔ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92342?language=python3