728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/92342
코딩테스트 연습 - 양궁대회
문제 설명 카카오배 양궁대회가 열렸습니다. 라이언은 저번 카카오배 양궁대회 우승자이고 이번 대회에도 결승전까지 올라왔습니다. 결승전 상대는 어피치입니다. 카카오배 양궁대회 운영위원
programmers.co.kr
풀이
- 라이언이 과녁에 n개의 화살을 쏘는데 한 점수에 여러번 쏠 수 있으므로 중복조합을 이용했다.
- 라이언과 아파치가 쏜 과녁을 비교해서 라이언이 아파치보다 각 점수를 많이 맞췄으면 score에 10-i를 더해줌.
- 아파치가 해당 점수에 쏜 화살이 0이 아니고 아파치가 라이언보다 같거나 많이 쐈으면 10-i를 빼줌
- 만약 score가 0보다 작으면 아파치의 점수가 더 높기 때문에 continue
- max_score와 score를 비교해서 max_score가 크면 max_score와 answer을 업데이트해줌
- max_score와 score가 같고, arrow가 answer보다 크면 answer을 업데이트해줌( 이 때, arrow를 0~10의 순서대로 저장 했으므로 arrow가 크다는 의미는 더 낮은 점수를 많이 쐈다는 의미임!!)
- 만약 max_score가 0이면 모든 경우에서 라이언이 아파치보다 총점이 낮기 때문에 [-1] 리턴
- 문제에서 10~0점의 순서대로 출력을 하라고 했으니 answer배열을 거꾸로 정렬해서 리턴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
from itertools import *
def solution(n, info):
answer = [-1]*11 # 0~10점수의 과녁에 맞춘 화살의 개수 저장
max_score=0 # 라이언과 아파치의 총점 차이의 최대값 저장
# combinations_with_replacement함수를 이용한 중복 조합
# range(11) 중에서 중복해서 n개를 뽑음
for comb in combinations_with_replacement(range(11),n):
arrow=[0]*11
score=0
for i in comb:
arrow[i]+=1
for i in range(11):
# arrow는 0~10과녁의 순서이므로 10-i를 해줌
# info는 10~0순서임
if arrow[10-i]>info[i]:
score+=10-i
elif info[i]!=0 and arrow[10-i]<=info[i]:
score-=10-i
if score<=0:
continue
if max_score<score:
max_score=score
answer=arrow
elif max_score==score:
if arrow>answer:
answer=arrow
if max_score==0:
return [-1]
else:
return answer[::-1]
|
cs |
728x90
반응형
'Python3 > 프로그래머스' 카테고리의 다른 글
2022.03.01 [프로그래머스] (python 파이썬) 파괴되지 않은 건물 (0) | 2022.03.01 |
---|---|
2022.02.28 [프로그래머스] (python 파이썬) 프린터 (0) | 2022.02.28 |
2022.02.27 [프로그래머스] (python 파이썬) 주차 요금 계산 (0) | 2022.02.27 |
2022.02.27 [프로그래머스] (python 파이썬) k진수에서 소수 개수 구하기 (0) | 2022.02.27 |
2022.02.27 [프로그래머스] (python 파이썬) 신고 결과 받기 (0) | 2022.02.27 |
댓글