Search
Duplicate

양궁대회

문제 설명 및 제한사항

아이디어 및 해결 방법

코드

def solution(n, info): # 냅색 문제 + 백트래킹으로 바꿔 풀 수 있을 것 같습니다. apeach_score = sum(10-i for i in range(11) if info[i] != 0) # 어피치가 확보한 점수를 뺏으면 score의 2배를 얻는 것으로 보면 되고, # 어피치가 확보하지 못한 점수를 얻으면 score를 얻는 것으로 보면 됩니다. # weight는 각 점수 별로 (어피치가 쏜 화살 수+1)로 정의됩니다. weights = [-1] + [x+1 for x in info] values = [-1] + [2*(10-i) if info[i] != 0 else (10-i) for i in range(11)] # 냅색 문제를 풉니다. A = [[0] * (n + 1) for _ in range(12)] for i in range(1, 12): for w in range(1, n+1): if weights[i] > w: A[i][w] = A[i-1][w] else: A[i][w] = max(A[i-1][w-weights[i]] + values[i], A[i-1][w]) # 오른쪽 끝 점수를 봅니다. # 어피치가 획득했던 점수보다 작거나 같으면 비기거나 진다는 뜻입니다. final_score = A[-1][-1] - apeach_score if final_score <= 0: return [-1] # 백트래킹 해서 각 점수에 화살을 얼마나 쏴야 할지 봅니다. answer = [0] * 11 w = n for i in range(11, 0, -1): # A[i][w] 값이 A[i-1][w-weights[i]] + values[i]와 같으면 # i점에 "적어도" weights[i]개의 화살을 쐈다는 것입니다. if A[i][w] == A[i-1][w-weights[i]] + values[i]: answer[i-1] = weights[i] w = w-weights[i] answer[-1] += (n - sum(answer)) return answer
Python
복사

출처

프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges