본문 바로가기
Python3/프로그래머스

2022.02.28 [프로그래머스] (python 파이썬) 양궁대회

by ian's coding 2022. 2. 28.
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
반응형

댓글