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개의 모든 경우의 수를 출력 해 줌

 

  1. list(combinations_with_replacement(range(0, 11), n))는 n번을 쏴서 맞춘 과녘의 점수의 모든 경우 수를 구하고,
    • 이것을 candidates에 넣음
  2. for candidate in candidates:에서 모든 경우 수를 확인하고,
    • for문이 candidates를 돌 때마다 lion의 과녁판 info2를 [0] * 11로 초기설정하고 점수 apeach와 lion를 0으로 초기설정함
  3. for score in candidate:에서 해당 경우 수를 확인하고,
    • for문이 candidate를 돌 때마다 해당 score에 매칭되는 info2의 인덱스에 1을 더해줌
  4. for score, (a, l) in enumerate(zip(info, info2)):에서 apeach와 lion의 점수를 구하고,
    • for문이 enumerate(zip(info, info2))를 돌 때마다 해당 과녘 score에서 apeach가 맞춘 횟수 a과 lion이 맞춘 횟수 l을 서로 비교하여 각 점수 apeach, lion에 if문에 맞게 더해줌
  5. if lion > apeach:에서 apeach와 lion의 점수를 비교함
    • 점수 lion이 apeach보다 작다면 넘어가고,
    • 점수 lion이 apeach보다 크다면 현재 점수 차 gap을 구하고,
    • 이전까지의 maxGap을 비교하여, gap이 더 크다면 maxGap에 현재 gap을 넣고 answer에 현재 info2를 넣고,
    • 이전까지의 maxGap을 비교하여, gap이 같거나 작다면 넘어감
  6. 마지막으로 최종 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)