알고리즘/프로그래머스
[프로그래머스]Lv2. 양궁대회(Python)
cha_eyoon
2024. 2. 29. 19:53
https://school.programmers.co.kr/learn/courses/30/lessons/92342
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 회고
<생각의 흐름>
중복 조합 라이브러리를 사용해서 n개의 화살을 쏴서 얻을 수 있는 라이언의 모든 점수의 조합을 생성한다.
조건에 의해 라이언은 어피치보다 더 많은 화살(초과)을 해당 점수에 맞혀야 점수를 얻는다.
라이언의 점수가 어피치의 점수보다 낮거나 같으면 [-1]을 반환
<코드의 흐름>
- 중복 조합 생성: n개의 화살을 쏴서 얻을 수 있는 모든 점수의 조합 생성 => 중복 허용
- 라이언의 점수 계산: 라이언은 어피치보다 더 많은 화살을 해당 점수에 맞혀야 점수 획득
- 어피치의 점수 계산: 어피치는 라이언이 같거나 적은 수의 화살을 해당 점수에 맞힌 경우 점수 획득
- 점수 차 계산: 라이언과 어피치의 점수 차 계산(max_gap 변수로 매 조합마다 갱신)
- 결과 반환: 최대 점수 차를 낸 화살 조합(max_gap) or 어떤 조합도 불가능하다면 초기값 반환
코드
from itertools import combinations_with_replacement
def solution(n, info):
answer = [-1] # 이길 수 있는 방법이 없다면(조건)
max_gap = -1 # 어피치와 라이언의 점수 차이 중 최대값
# 0~11까지 n개의 숫자를 뽑는 모든 경우의 수
for combi in combinations_with_replacement(range(11), n):
info2 = [0] * 11 # 라이언의 화살의 개수를 저장할 리스트
# print(combi) # (0, 0, 0, 0, 10)
for i in combi:
info2[10-i] += 1 # [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4]
apeach, lion = 0, 0
for i in range(11):
# 어피치와 라이언이 모두 그 점수를 획득하지 못한 경우, 다음 점수로 pass
if info2[i] == info[i] == 0:
continue
# 어피치가 라이언보다 많거나 같은 횟수로 그 점수를 획득한 경우, 어피치가 점수 획득
elif info2[i] <= info[i]:
apeach += (10-i)
else:
lion += (10-i)
if lion > apeach:
gap = lion-apeach
# 최대 점수 차이 갱신, 라이언 화살 개수 answer에 담기
if gap > max_gap:
max_gap = gap
answer = info2
return answer