728x90
반응형
🔗 Problem Link
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
❔Thinking
- 가장 큰 점수 차이로 상대를 이기는 경우를 반환하고, 불가능하다면 -1을 반환한다.
- 총 N발의 화살이 주어지고, 상대보다 해당 점수에 더 많은 화살을 맞혀야 해당 점수를 가져올 수 있다.
- 점수차 같은 경우에는, 더 적은 점수에 화살을 쏜 경우를 반환한다.
💻Solution
def solution(n, info):
# 해당 점수를 획득 한다 or 못한다
def get_score(arrow:int, targets:list, now_target:int):
if now_target == 10 or arrow == 0:
nonlocal score_diff, answer
if arrow > 0:
targets[-1] += arrow
a, l = 0, 0
for i in range(11):
if (info[i] > 0) and (info[i] >= targets[i]):
a += 10-i
elif (targets[i] > 0) and (targets[i] - info[i] > 0):
l += 10-i
if l - a > 0:
if (l - a > score_diff) or (l - a == score_diff and targets[::-1] > answer[::-1]):
score_diff = l-a
answer[:] = targets
targets[-1] -= arrow
return
# 이긴다 = 해당 점수에 화살을 쏜다
if arrow >= info[now_target]+1:
targets[now_target] += info[now_target]+1
arrow -= info[now_target]+1
get_score(arrow, targets, now_target+1)
arrow += info[now_target]+1
targets[now_target] -= info[now_target]+1
# 진다 = 해당 점수에 쏘지 않고 다음 점수로 넘어간다
get_score(arrow, targets, now_target+1)
answer = [-1]
score_diff = 0
get_score(n, [0 for _ in range(11)], 0)
return answer
🗝️keypoint
- 0부터 10점까지의 과녁이 있기 때문에, 각 점수를 얻는다 or 얻지 못한다로 구분지어 생각할 수 있다.
- 재귀 함수로 변수들을 넘길때는, 더하거나 빼는 등의 행위는 반드시 원상복구 시켜야 한다.
'코딩테스트 > Python' 카테고리의 다른 글
[Programmers] Level 2. 3xn 타일링 (0) | 2025.02.05 |
---|---|
[Baekjoon] 1062. 가르침 (0) | 2025.02.02 |
[Baekjoon] 1025. 제곱수 찾기 (0) | 2025.01.30 |
[Programmers] Level 2. 혼자 놀기의 달인 (0) | 2025.01.28 |
[Baekjoon] 1202. 보석 도둑 (0) | 2025.01.28 |