프로그래머스-파이썬
양궁대회
daco
2022. 9. 14. 21:54
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
try1
경우의 수를 다 확인하기 싫어서 규칙을 찾아보려고 함
하지만 결국 실패해서 이번엔 다른 사람 코드를 분석하려고 함
※ 다른 사람 코드
from itertools import combinations_with_replacement
def solution(n, info):
answer = [-1]
maxGap = -1e9
candidates = list(combinations_with_replacement(range(0, 11), n))
# 화살을 n번 쏴서 맞춘 과녘 점수의 모든 경우 수
for candidate in candidates: # for문으로 모든 경우 수를 확인함
info2 = [0] * 11 # lion의 초기 info2 설정
apeach, lion = 0, 0 # apeach, lion의 초기 점수 설정
for score in candidate:
info2[10 - score] += 1 # 해당 경우 수의 점수에 해당하는 info2의 인덱스에 1을 더해줌
for score, (a, l) in enumerate(zip(info, info2)): # apeach와 lion의 점수를 구함
if a == l == 0:
continue
elif a >= l:
apeach += (10 - score)
else:
lion += (10 - score)
if lion > apeach: # apeach와 lion의 점수를 비교함
gap = lion - apeach
if gap > maxGap:
maxGap = gap
answer = info2
return answer
문제풀이)
from itertools import combinations_with_replacement
candidates = list(combinations_with_replacement(range(0, 5), 3))
candidates
위의 코드 출력:
더보기
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 3), (0, 3, 4), (0, 4, 4),
(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 3), (1, 3, 4), (1, 4, 4),
(2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (2, 4, 4),
(3, 3, 3), (3, 3, 4), (3, 4, 4),
(4, 4, 4)]
출력을 보면 위의 코드는 0 ~ 4까지의 숫자 3개의 모든 경우의 수를 출력 해 줌
- list(combinations_with_replacement(range(0, 11), n))는 n번을 쏴서 맞춘 과녘의 점수의 모든 경우 수를 구하고,
- 이것을 candidates에 넣음
- for candidate in candidates:에서 모든 경우 수를 확인하고,
- for문이 candidates를 돌 때마다 lion의 과녁판 info2를 [0] * 11로 초기설정하고 점수 apeach와 lion를 0으로 초기설정함
- for score in candidate:에서 해당 경우 수를 확인하고,
- for문이 candidate를 돌 때마다 해당 score에 매칭되는 info2의 인덱스에 1을 더해줌
- for score, (a, l) in enumerate(zip(info, info2)):에서 apeach와 lion의 점수를 구하고,
- for문이 enumerate(zip(info, info2))를 돌 때마다 해당 과녘 score에서 apeach가 맞춘 횟수 a과 lion이 맞춘 횟수 l을 서로 비교하여 각 점수 apeach, lion에 if문에 맞게 더해줌
- if lion > apeach:에서 apeach와 lion의 점수를 비교함
- 점수 lion이 apeach보다 작다면 넘어가고,
- 점수 lion이 apeach보다 크다면 현재 점수 차 gap을 구하고,
- 이전까지의 maxGap을 비교하여, gap이 더 크다면 maxGap에 현재 gap을 넣고 answer에 현재 info2를 넣고,
- 이전까지의 maxGap을 비교하여, gap이 같거나 작다면 넘어감
- 마지막으로 최종 answer을 리턴함
- 가장 낮은 점수를 더 많이 맞힌 경우부터 for문이 돌기 때문에 "라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지 일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 return 해주세요."라는 조건이 자동으로 충족됨
테스트 결과) - 총합 3460.94ms
더보기
테스트 1 〉 | 통과 (0.21ms, 10.2MB) |
테스트 2 〉 | 통과 (229.48ms, 20.7MB) |
테스트 3 〉 | 통과 (244.38ms, 20.8MB) |
테스트 4 〉 | 통과 (10.21ms, 10.3MB) |
테스트 5 〉 | 통과 (539.80ms, 34.6MB) |
테스트 6 〉 | 통과 (523.10ms, 34.7MB) |
테스트 7 〉 | 통과 (11.60ms, 10.3MB) |
테스트 8 〉 | 통과 (0.47ms, 10.3MB) |
테스트 9 〉 | 통과 (5.61ms, 10.3MB) |
테스트 10 〉 | 통과 (0.47ms, 10.2MB) |
테스트 11 〉 | 통과 (3.52ms, 10.2MB) |
테스트 12 〉 | 통과 (3.54ms, 10.2MB) |
테스트 13 〉 | 통과 (80.18ms, 12MB) |
테스트 14 〉 | 통과 (275.52ms, 20.7MB) |
테스트 15 〉 | 통과 (221.87ms, 20.8MB) |
테스트 16 〉 | 통과 (16.52ms, 10.6MB) |
테스트 17 〉 | 통과 (5.71ms, 10.3MB) |
테스트 18 〉 | 통과 (0.11ms, 10.3MB) |
테스트 19 〉 | 통과 (0.02ms, 10MB) |
테스트 20 〉 | 통과 (218.33ms, 20.7MB) |
테스트 21 〉 | 통과 (219.31ms, 20.6MB) |
테스트 22 〉 | 통과 (457.44ms, 34.8MB) |
테스트 23 〉 | 통과 (0.48ms, 10.2MB) |
테스트 24 〉 | 통과 (443.95ms, 34.7MB) |
테스트 25 〉 | 통과 (429.11ms, 34.7MB) |