[파이썬] 프로그래머스 : 양궁대회 (Lv.2)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
0.방향성 생각
n이 최대 10발. 모든 경우의 수를 생각해도 충분히 적다. 완전 탐색으로 풀이
중복조합을 활용해서 모든 케이스를 구한다.
1. 중복조합 활용, 화살의 개수 카운트
from itertools import combinations_with_replacement as H
def solution(n,apeach):
apeach = apeach[::-1] # 0점~10점 정렬
temp = list(range(0,11))
lion_list = list(H(temp,n)) # 중복조합
score_sub,score_board = [],[]
for score in lion_list : # 모든 케이스 탐색
table = {idx : 0 for idx in range(11)} # 딕셔너리 초기화
for j in score : # 화살 개수 계산하고
table[j] += 1
각 케이스마다 중복조합으로 만들어진 튜플에 for문을 돌려서 화살의 개수를 계산한다.
점수는 0점~10점 순으로 만들어서 인덱스랑 점수를 맞춰준다.
2. 점수 계산
score_a, score_l = 0,0 # 점수계산
lion = sorted(list(table.items()),key=lambda x:x[0])
lion = [item[1] for item in lion]
for idx,(a,l) in enumerate(zip(apeach,lion)) :
if a!=0 or l!=0 : # 점수가 하나라도 있는 경우
if a >= l : # 어피치가 같거나 많이쏘면
score_a += idx # 어피치 점수
else : # 아닌 경우
score_l += idx # 라이언 점수
if score_a < score_l : # 라이언이 이긴경우
score_sub.append(score_l-score_a) # 점수차 추가
score_board.append(lion) # 케이스 추가
어피치, 라이언의 점수를 계산한다.
zip으로 동시에 점수 두개를 받고 enumerate를 활용해서 점수를 추가할 때 인덱스를 바로 불러와준다.
라이언이 이긴 경우에 리스트에 점수차, 화살 분포를 추가해준다.
3. 답 구하기
if not score_board : # 이긴 경우 없으면
return [-1]
max_score_sub = max(score_sub) # 최대 점수차이
answer = [score_board[::-1] for score_sub, score_board in zip(score_sub, score_board) \
if score_sub == max_score_sub] # 최대 점수차이로 이긴 경우 10점 ... 0점 순으로
answer.sort(key = lambda x:(x[10],x[9],x[8],x[7],x[6],x[5],x[4],x[3],x[2],x[1],x[0]))
return answer[-1]
라이언이 이긴 경우가 없으면 score_board가 비어있다. 이 경우 [-1] 리턴
그렇지 않은 경우에는 최대 점수차이가 몇인지 구하고 scoer board에서 최대 점수차이를 가진 리스트들을 불러와준다.
이 때 점수를 10점, 9점, ... , 0점 순으로 다시 넣어준다.
0점부터 오름차순으로 정렬하고 맨 뒤에 원소를 불러와주면 점수가 낮은 쪽에 화살이 많이 맞은 케이스를 가져와준다.
전체코드
from itertools import combinations_with_replacement as H
def solution(n,apeach):
apeach = apeach[::-1] # 0점~10점 정렬
temp = list(range(0,11))
lion_list = list(H(temp,n)) # 중복조합
score_sub,score_board = [],[]
for score in lion_list : # 모든 케이스 탐색
table = {idx : 0 for idx in range(11)} # 딕셔너리 초기화
for j in score : # 화살 개수 계산하고
table[j] += 1
score_a, score_l = 0,0 # 점수계산
lion = sorted(list(table.items()),key=lambda x:x[0])
lion = [item[1] for item in lion]
for idx,(a,l) in enumerate(zip(apeach,lion)) :
if a!=0 or l!=0 : # 점수가 하나라도 있는 경우
if a >= l : # 어피치가 같거나 많이쏘면
score_a += idx # 어피치 점수
else : # 아닌 경우
score_l += idx # 라이언 점수
if score_a < score_l : # 라이언이 이긴경우
score_sub.append(score_l-score_a) # 점수차 추가
score_board.append(lion) # 케이스 추가
if not score_board : # 이긴 경우 없으면
return [-1]
max_score_sub = max(score_sub) # 최대 점수차이
print(max_score_sub)
answer = [score_board[::-1] for score_sub, score_board in zip(score_sub, score_board) \
if score_sub == max_score_sub] # 최대 점수차이로 이긴 경우 10점 ... 0점 순으로
answer.sort(key = lambda x:(x[10],x[9],x[8],x[7],x[6],x[5],x[4],x[3],x[2],x[1],x[0]))
return answer[-1]
코멘트
마지막에 정렬이 좀 꼬여서 시간이 좀 걸렸다.
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 프로그래머스 : [3차] 방금그곡 (Lv.2) (0) | 2023.06.28 |
---|---|
[파이썬] 백준 18111: 마인크래프트 (실버2) (0) | 2023.06.24 |
[파이썬] 백준 27084 : 카드 뽑기 (골드5) (0) | 2023.06.22 |
[파이썬] 백준 20529: 가장 가까운 세 사람의 심리적 거리 (실버1) (0) | 2023.06.21 |
[파이썬] 백준 1541 : 잃어버린 괄호 (실버2) (0) | 2023.06.20 |
[파이썬] 백준 1074 : Z (실버1) (0) | 2023.06.05 |
[파이썬] 백준 1992 : 쿼드트리 (실버1) (0) | 2023.06.05 |
댓글