알고리즘

[프로그래머스 Lv2 - 2022 KAKAO BLIND RECRUITMENT] 양궁 대회 (Python)

lwkejpf 2022. 9. 19. 10:45

 


 

from itertools import combinations_with_replacement
from collections import Counter

def solution(n, info):
    answer = [-1]
    max_gap = 0 
    
    for arrow in combinations_with_replacement(range(10, -1, -1), n): 
        apeach, lion = 0, 0
        cnt = Counter(arrow)
        info2 = [0 for _ in range(11)]
        
        for i in range(11) :
            info2[i] = cnt[10-i]
            
            if info[i] > info2[i] :
                apeach += (10-i)
            elif info[i] < info2[i]:
                lion += (10-i)  
            elif info[i] == info2[i] and info[i] != 0:
                apeach += (10-i) 
                
        if lion > apeach :
            gap = lion - apeach 
            if gap > max_gap :
                max_gap = gap
                answer = info2  
            elif gap == max_gap:
                for i in range(10, -1, -1) :  
                    if info2[i] > answer[i] : 
                        answer = info2 
                        break  
    return answer

 

중복 조합이랑 개수 세는 Counter 라이브러리 사용해서 풀었다

사실 이 문제 도저히 감이 안 와서 다른 분 블로그 참고했음 .. 히히

 

apeach 랑 lion 은 각각 총 점수를 의미하고,

만약 lion 점수가 더 크면 gap 계산해서 기존에 max_gap 보다 같거나 크면 값 바꿔주게끔 함

 

 

라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지 일 경우,

가장 낮은 점수를 더 '많이' 맞힌 경우를 return 해주세요.

 

이 조건 봤을 때 어차피 10점부터 0점 순으로 내려오게 했으니까

gap >= max_gap 해 주면 알아서 될 줄 알았는데 아니었고 ,,

 

포인트는 가장 낮은 점수를 더 '많이' 였다 ㅠ 이거때매 엄청 헤맴

 

 

 

 

 

저 조건 해결 못하면 이렇게 8, 18번 굴레에 빠지게 됩니다 ..^^& 

 

 


 

        if lion > apeach :
            gap = lion - apeach 
            if gap > max_gap :
                max_gap = gap
                answer = info2  
            elif gap == max_gap:
                for i in range(10, -1, -1) :  
                    if info2[i] > answer[i] : 
                        answer = info2 
                        break

 

그리고 다른 분 코드랑 비교해보다가 유레카 외치고 드뎌 품 ㅠ

 

마지막 if 문에서 info2[i] > answer[i] 로 조건을 줘 버리면

가장 낮은 점수가 어피치에 해당하는 경우를 무시하는 코드였던 것임

 

라이언 점수가 어피치보다 클 때만을 기다렸던거니께 ,,,

 

 

 

 

 

 

        if lion > apeach :
            gap = lion - apeach 
            if gap > max_gap :
                max_gap = gap
                answer = info2  
            elif gap == max_gap:
                for i in range(10, -1, -1) :  
                    if info2[i] != 0 or answer[i] != 0 :
                        if info2[i] > answer[i] :
                            answer = info2
                            break

 

이렇게 쓰고 왜 안 되는지 또 한참을 고민했다

생각해보니까 기존꺼 answer 이 더 큰 경우가 있을텐데 또 그거 무시하고

현재 info2 가 더 큰 점수 있을 때만을 기다렸다가 answer 갱신해준거임,, ㅎㅎ,,,,, 바본가 ,,,

 

 

 

 

 

 

 

        if lion > apeach :
            gap = lion - apeach 
            if gap > max_gap :
                max_gap = gap
                answer = info2  
            elif gap == max_gap:
                for i in range(10, -1, -1) :  
                    if info2[i] != 0 or answer[i] != 0 :
                        min_idx = i
                        break
                if info2[min_idx] > answer[min_idx] :
                    answer = info2

 

 

그래서 기존꺼 answer 이랑 현재 info2 랑 과녁 0 부터 비교해나가다가

둘 중 하나라도 1 점 이상되는 순간 min_idx 에 인덱스 저장하고 바로 break 해줌.

 

그리고 드디어

 

 

 

 

험난했다 진짜 ..... ㅠ ㅠ