[프로그래머스 LV3] 최고의 집합

Junyoung Park·2022년 2월 17일
0

코딩테스트

목록 보기
64/631
post-thumbnail

1. 문제 설명

최고의 집합

2. 문제 분석

s를 n개의 자연수 합으로 표현한다. 가능한 모든 조합 중 곱이 가장 큰 경우의 집합을 구한다.

가장 곱이 큰 경우가 어떤 경우일까? 자연수 8를 2개 자연수의 합으로 표현할 때 {1, 7}, {2, 6}, {3, 5}, {4, 4}가 존재한다. 각 곱은 7, 12, 15, 16이다. 여기에서 한 가지 힌트를 얻을 수 있다. 곱해지는 수 사이의 차가 가장 작은 조합이어야 한다는 것이다.

  1. s를 n으로 나눈 몫을 통해 각 버킷(즉 배열의 특정 인덱스)에 담을 기본값을 세팅하자.
  2. 나머지 r을 하나씩 버킷에 더해가면서 총합 s를 충족시키자.

3. 나의 풀이

def solution(n ,s):
    q, r = divmod(s, n)
    if q==0: return [-1]
    result = [q]*n
    # s를 n개 자연수 합으로 표현할 때 가장 큰 곱이 나올 경우: 각 버킷에 담긴 자연수 간 차가 가장 작다
    # s=11 n=3 -> [n1, n2, n3] 중 [3, 3, 3]을 먼저 구해 놓고 나머지 2를 각 버킷에 1씩 나눠서 더해준다.
    idx = -1
    for _ in range(r):
        result[idx] += 1
        idx -= 1
    # 오름차순 정렬용
    return result
profile
JUST DO IT

0개의 댓글