이 문제를 3가지 방식으로 풀었는데, 각각의 방법 모두 좋은 것 같아 3가지 방법으로 풀어보았다.
문제에 접근할때 생각은 n개를 쏘는데, 10부터 0점중에 n개를 어떻게 나열할까라고 생각했다. 그렇기 때문에 0부터 10까지 숫자중에 중복하여 n개의 숫자를 뽑고 모든 경우의 수를 탐색하여 최적의 해를 찾는 방향으로 풀이를 잡았다.
from itertools import combinations_with_replacement
def compare(a,b):
apeche = 0
lion = 0
for i in range(11):
if a[i] == 0 and b[i] == 0:
continue
elif a[i] >= b[i]:
apeche += 10 - i
else:
lion += 10 - i
return apeche,lion
def solution(n, info):
score_diff = 0
possible = []
combination = combinations_with_replacement(range(11),n)
for comb in combination:
lion = [0]*11
for c in comb:
lion[c] += 1
apeche_score,lion_score = compare(info,lion)
if lion_score - apeche_score > score_diff:
del possible[:]
possible.append(lion)
score_diff = lion_score - apeche_score
elif lion_score - apeche_score == score_diff and score_diff != 0:
possible.append(lion)
# 배열 원소 순으로 정렬
if len(possible) == 0:
return [-1]
for i in range(len(possible)):
possible[i].reverse()
possible.sort(reverse = True)
possible[0].reverse()
return possible[0]
def compare(a, b):
return a[::-1] > b[::-1]
def solution(n, info):
ans = [-1] * 12
for lionbit in range(1024): ##
lion = [0] * 12
ascore = 0
lscore = 0
cnt = n
for maskbit in range(10):
x = lionbit & (1 << maskbit)
if x: ## 비트가 켜져 있다면 라이언이 이겨야 하는 경우
lscore += 10 - maskbit
lion[maskbit] = info[maskbit] + 1
cnt -= lion[maskbit]
elif info[maskbit] != 0: ## 어피치가 이기는 경우
ascore += 10 - maskbit
if lscore <= ascore or cnt < 0:
continue
lion[10] = cnt
lion[11] = lscore - ascore
if compare(lion, ans):
ans = lion[:]
if ans[-1] == -1:
return [-1]
else:
ans.pop()
return ans
인덱스마다 라이언이 점수를 얻어갈때/얻어가지 못할때를 기준으로 가지치기를 통해 라이언의 점수를 얻고, 인덱스가 마지막인데 화살이 남았다면 0점에 모두 몰아주었다.
answer = [-1] * 12
def compare(a, b):
return a[::-1] > b[::-1]
def solution(n, info):
dfs(n, 0, [0] * 12, info)
answer.pop()
return answer
def dfs(arrow_left, idx, lion, apeche):
global answer
if arrow_left < 0:
return
if idx >= 10: ## dfs의 끝
lscore = 0
ascore = 0
lion[10] = arrow_left
print(arrow_left,lion)
for j in range(10):
if apeche[j] == 0 and lion[j] == 0:
continue
if lion[j] > apeche[j]:
lscore += (10 - j)
else:
ascore += (10 - j)
if lscore > ascore:
lion[11] = lscore - ascore
if compare(lion, answer):
answer = lion[:]
return
lion[idx] = apeche[idx] + 1
dfs(arrow_left - (apeche[idx] + 1), idx + 1, lion, apeche)
lion[idx] = 0
dfs(arrow_left,idx+1,lion,apeche)