반응형

양궁대회 문제 분석하기
해당 문제는 라이언과 어피치가 n개의 화살을 쏴서 라이언이 가장 큰 점수차로 이긴 배열을 반환하는 문제입니다.
첫번째 조건
단 조건이 있는데요 라이온은 챔피언이라 어피치에게 핸디캡을 주고 시작합니다.
0 ~ 10점까지가 있는데 땅따먹기처럼 하나의 점수는 한 사람만 점수를 획득할 수 있습니다.
예를들어 10점을 어피치와, 라이온이 1발씩 맞춘다면 어피치가 10점을 가져가게 되는 것입니다.
그렇기에 점수를 획득하려면 무조건 어피치 + 1의 점수를 맞춰야 하는 것입니다.
두번째 조건
가장 큰 점수차가 2개 이상이라면 점수가 낮은 배열순으로 많이 맞춘 배열을 선택합니다.
의사코드 작성하기
- lion이 쏠 수 있는 모든 경우의 수 만들기 -> product
- 중복 o
- 순서 o
- 라이언이 n개 이하로 쏜 Case만 점수 계산하기
- 라이언 점수 구하기
- 어피치 점수 구하기
- 라이언 - 어피치 > 최대 점수 일 때 결과 저장
코드 작성
from itertools import product
def solution(n, info):
answer = [-1]
info.reverse()
maxi = 0
for case in product([True, False], repeat=len(info)): # 모든 경우의 수 만들기
lion_arrow = sum(info[i]+1 for i in range(len(case)) if case[i]) # 화살 갯수 확인하기
if lion_arrow <= n:
lion_score = sum(i for i in range(len(case)) if case[i]) # 라이언 점수 구하기
apeach_score = sum(i for i in range(len(case)) if not case[i] and info[i]) # 어피치 점수 구하기
result = lion_score - apeach_score
if result > maxi:
maxi = result
answer = [info[i]+1 if case[i] else 0 for i in range(len(case))] #결과 저장
answer[0] += n-lion_arrow # 만약 화살 쏜갯수가 n개보다 적으면 0점에 남은 화살수 추가
answer.reverse()
return answer
반응형
'코딩테스트' 카테고리의 다른 글
[Python] 백준 1430 공격 (0) | 2023.09.16 |
---|---|
[ Python ] 프로그래머스 택배상자 (0) | 2023.06.29 |
[Python] 프로그래머스 프렌즈 4블록 (1) | 2023.05.15 |
[Python] 프로그래머스 길 찾기 게임 Tree 자료형으로 풀기 (1) | 2023.05.13 |
[Python] 프로그래머스 후보키 (0) | 2023.05.07 |