[프로그래머스] 양궁대회 파이썬 Python

0

Problem Solving

목록 보기
14/49
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/92342

풀이

dfs로 쏘지 않을때, 쏠때를 구분하여 경우의 수를 시뮬레이션 한 다음
어피치와 점수차이가 최대값이 되게 sort후 출력하는 방식으로 풀이함.

주의할점은 8,18 테스트케이스와 23번 테스트케이스인데
8,18은 제한사항에서 확인할 수 있듯이, 같은 점수차이라면
낮은 점수를 많이 맞춘 경우가 출력이 되어야하므로, 그 부분을 신경써주면된다.
나 같은 경우는 점수가 낮아질수록 높은 우선순위 점수를 부여해서 sort 조건으로 붙여주었다.

23번 테스트케이스는 라이언과 어피치가 비기는 경우이며,
점수차이가 0일때에도 [-1] 을 리턴해주도록 해주면 된다.

def solution(n, info):
    answer = []
    
    # 10,9...1,0 score
    score = list(range(10,-1,-1))
    # dfs함수
    def dfs(n, result, total, index, apeach,priority):
    # n = 화살갯수 / result = 출력리스트/ total = 내 점수
    # index = 인덱스,종료조건 / apeach = 어피치 점수 / priority = 우선순위(낮은 점수일 수록 높음)
        apeach_score = score[index] if info[index] else 0
        if index==10: # 종료조건
        	# answer 리스트에 저장 ( +[n] 은 남은 화살 다쏘기)
            answer.append([total-apeach,result+[n],priority])
            return
        elif n == 0: # 화살이 없을때 (리스트 뒤에 0 채워주기 위함)
            dfs(n, result+[0], total, index+1, apeach+apeach_score,priority)
        else:
            for i in range(2): # 두가지 경우의 수 : 쏘지 않고 넘길때, 쏠 때
                ryan = info[index]+1
                if i == 0 or n < ryan: # 쏘지 않고 넘길때
                    dfs(n, result+[0],total,index+1,apeach+apeach_score, priority)
                else:
                    # 어피치보다 한발 더 쏘는경우
                    # result list에 ryan변수만큼 추가, 점수추가, 우선순위점수 추가
                    # 화살 갯수 감소 ( n - ryan )
                    dfs(n-ryan,result+[ryan],total+score[index],index+1,
                        apeach, priority+score[10-index])
    
    # dfs 실행
    dfs(n, [], 0, 0, 0, 0)
    
    # 점수차이와 우선순위 기준으로 sort, 점수차이와 우선순위는 클 수록 좋으므로 뒤집어줌
    answer.sort(key=lambda x: [x[0],x[2]], reverse = True)
    
    # 점수차가 나지않는경우(이길수 없는경우) -1 리턴
    if answer[0][0] <= 0:
        return [-1]
    else:
    	# 내가 이긴 경우
        # result list 리턴
        return answer[0][1]

뭔가 코드가 정리가 안된느낌이지만 어디서부터 정리해야될지 몰라 일단 올림..

0개의 댓글