Python/CoTe

[programmers] level3 - 최고의 집합 python

joannekim0420 2022. 11. 14. 01:51
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12938#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

※ 접근법 첫 번째 힌트,

합이 s가 되는 모든 경우의 수를 구해서, 곱했을 때 최고일 때를 구하는 것이 아니다.  효율성 테스트에서 실패

어떤 숫자의 조합으로 곱했을 때 최댓값을 구하는지 딱 하나의 정답만 생각하면 된다. 

(프로그래머스는 예시 설명을 하면서 사람을 일부러 생각을 한 쪽으로만 유도하는 경향이 있는 것 같다..)

 

 

 

 

※ 접근법 두 번째 힌트, 

(첫 번째 힌트로만 못 풀었을 때, 어떤이 뭔지 감이 안 잡힐 때!)

최대가 되는 조합은, 그 요소들간 차이가 가장 적을 때 이다. 

예를 들어, 2개의 합이 9가 되는 경우에는, 두 요소간 차이가 가장 적은 {4,5}가 정답이다. 

{1,8}, {2,7}, {3,6} 다 고려할 필요 없고, {4,5}를 구하는 방법만 코드로 짜면 된다.

 

n개의 요소들끼리 차이가 가장 적으려면 당연히 s를 n으로 나누어서 나오는 값을 최소로 시작하면 된다.

 

 

※ 추가 테스트 케이스

n = 3, s = 8, [2,3,3]

n = 3, s = 6, [2,2,2]

 

 

 


 

 

 

정답

def solution(n, s):
    answer = []
    if n > s:	#최고의 집합이 존재하지 않는 경우
        return [-1]
    
    while n != 1:	#n의 개수만큼 요소를 모두 구해야함
    	#n 개의 요소들 끼리 차이가 가장 적으려면 최소한 s를 n으로 나눈 값으로 해야 한다.
        k = s // n		#k는 첫 번째 요소 
        answer.append(k)
        n -= 1
        if n == 1:	#모든 요소를 다 구했다면, while문 빠져나갈 조건
            answer.append(s-k)
        s -= k
        
    return answer