Just Fighting
[프로그래머스] 양궁대회 본문
https://programmers.co.kr/learn/courses/30/lessons/92342
<문제 설명>
양궁대회를 한다. 라이언은 저번대회 우승자. 상대는 어피치.
다양한 선수를 우승시키기 위한 규칙은 아래와 같다.
어피치 n발 다쏘고 라이언 n발 쏘기
점수계산
# 같은 점수이면 더 많이 맞힌 사람이 그 점수 가져가기
# 아무도 못맞혔으면 점수 없음
# 똑같이 맞혔으면 어피치가 점수 획득
# 모든 과녁 점수에 대해 최종점수 계산
# 최종 점수 높은 사람이 우승자
라이언이 어피치를 "가장 큰 점수 차"로 이기기 위해 어떤 과녁 점수에 맞혀야 하는가?
10점부터 0점까지 순서대로 배열에 담아 리턴
우승하지 못하면(지거나 비기는 경우) [-1] 리턴
가장 큰 점수차 방법 여러 개면 가장 낮은 점수를 더 많이 맞힌경우 리턴
<문제 이해>
dfs로 구현해 11개의 점수에 점수를 분배하고,
그 중에서 어피치와 가장 큰 점수차를 내는 리스트를 저장하면 될 것이라고 생각했다.
처음에는 점수를 먹으려면 무조건 어피치보다 높으면 되니까 0 아니면 (어피치 점수)+1 이라고 생각하고 문제를 풀었다.
하지만 예시에도 꼭 그렇지만은 않았기 때문에 0점부터 (어피치 점수)+1의 점수를 주는 것으로 변경했다.
<문제 풀이>
maxScore = 0 # 가장 큰 점수 차이
maxList = [] # 가장 큰 점수 차이를 낸 배열
def ryanScore(index, score, n, apeach) : # dfs 함수
if n == 0 : # 횟수가 0 이면 calScore() 호출
calScore(score, apeach)
return
if index == 11: return # 0~10까지의 점수만 존재
sc = apeach[index] # 어피치가 (index)점을 맞힌 횟수
for i in range(sc+2): # 0부터 (index)+1까지 맞히는 경우만 고려
if n >= i: # n보다 크면 안되니까 고려
score[index] = i
ryanScore(index+1, score, n-i, apeach)
score[index] = 0
def calScore(ryan, apeach): # 점수 계산 함수
global maxScore, maxList
rScore = 0 # 라이언 점수
aScore = 0 # 어피치 점수
for i in range(11):
if ryan[i] == 0 and apeach[i] == 0: continue # 둘다 0이면 패스
if ryan[i] > apeach[i] : rScore += (10-i) # 라이언이 더 많이 맞췄으면 점수획득
else : aScore += (10-i) # 아니면 어피치 점수획득
if rScore > aScore : # 라이언 점수가 더 높을 때만 고려
diff = rScore - aScore
if diff > maxScore: # 최대값 갱신
maxScore = diff
maxList = list(ryan)
elif diff == maxScore: # 최대값이 같을 경우
for i in range(11):
if ryan[-i] > maxList[-i]: # 낮은 점수를 많이 맞은 경우가 선택
maxList = list(ryan)
break
elif ryan[-i] < maxList[-i]:
break
def solution(n, info):
temp = [0 for i in range(11)]
ryanScore(0, temp, n, info) # dfs
if len(maxList)==0 : return [-1]
else: return maxList
코드가 아주 길다... 그래서 아주 오래 걸렸다,, 시행착오를 아주 많이 겪었다,,ㅎㅎㅎ
라이언의 점수를 구하는 함수와 점수를 계산하고 최대값을 찾는 함수를 따로 만들어 사용하였다.
마지막에 solution()에서 maxList를 출력해보는데 계속 0으로만 가득찬 배열이 나왔다.
배열이다 보니 제대로 복사되지 않아서 그런 것 같아 list()를 사용해 복사해주니 잘 출력되었다.
너어어ㅓ어어어무 오래 걸렸다,,
'Algorithm > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 괄호 변환 (0) | 2022.01.25 |
---|---|
[프로그래머스] 메뉴 리뉴얼 (0) | 2022.01.21 |
[프로그래머스] 주차 요금 계산 (0) | 2022.01.19 |
[프로그래머스] k진수에서 소수 개수 구하기 (0) | 2022.01.18 |
[프로그래머스] 신고 결과 받기 (0) | 2022.01.17 |