공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 프로그래머스. 최고의 집합 (Level 3)

inspirit941 2019. 11. 18. 17:04
반응형

 

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

 

코딩테스트 연습 - 최고의 집합 | 프로그래머스

자연수 n 개로 이루어진 중복 집합(multi set, 편의상 이후에는 집합으로 통칭) 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다. 각 원소의 합이 S가 되는 수의 집합 위 조건을 만족하면서 각 원소의 곱 이 최대가 되는 집합 예를 들어서 자연수 2개로 이루어진 집합 중 합이 9가 되는 집합은 다음과 같이 4개가 있습니다. { 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 } 그중 각 원소의 곱이 최대인 { 4, 5 }

programmers.co.kr

 

주어진 n과 s에서, 자연수의 개수 n보다 s의 크기가 큰 경우는 불가능하다. 자연수 5개로 3을 만드는 것이 불가능한 것처럼.

따라서 n이 s보다 큰 경우는 [-1]을 반환하면 된다.

 

숫자 s를 자연수 n개로 표현하면서 '곱이 가장 큰 수'가 되도록 하려면, n개의 각 자연수 간 차이가 적어야 한다.

 

숫자 s를 n으로 나눈 몫을 n개만큼 result 리스트에 저장하면 일단 곱이 가장 큰 조합이 만들어진다.

ex) 7을 3개의 자연수로 표현한다? -> [2,2,2] . (7 // 3 = 2)

이 때, s를 n으로 나눈 나머지가 남을 수 있다. 위 사례의 경우 나머지는 1이고, 문제의 조건인 '오름차순 정렬'을 충족시키려면 나머지 숫자만큼 result 리스트의 맨 뒤에서부터 숫자 1을 더해줘야 한다. [2,2,2]에서 맨 뒷 숫자부터 1씩 더해줘야 한다. 즉 위 사례에서는 최종적으로 [2,2,3]이 만들어진다.

 

마찬가지로, 8을 3개의 자연수로 표현하면 [2,2,2]에서 출발하고, 나머지가 2이므로 뒤에서부터 숫자 1씩 더해주면 된다. [2,3,3]이 최종 결과가 된다.

 

코드로 표현하면 아래와 같다,

 

 

반응형