코딩테스트/그리디
최고의 집합
수타.
2023. 7. 3. 11:46
https://school.programmers.co.kr/learn/courses/30/lessons/12938
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약:
합이 s가되는 n개의 숫자중 가장 그들의 곱이 큰 값을 반환하시오
소요시간:
7분
난이도3
코딩:
def solution(n, s):
#최대한 equal하게 n개로 나누기
arr = [s//n]*n
#arr에 뒤에서부터 한개씩 뿌려주기
for i in range(s%n):
arr[n-i-1] +=1
#이때 만약 0이 있다면, 존재하지 않는다면 -1반환
if arr[0] ==0:
return [-1]
else:
return arr
난이도에 비해 간단한 문제였다고 생각합니다. 대체적으로 수학적인 아이디어가 들어간 문제들이 이에 익숙한 사람들은 조금더 쉽게 풀 수 있다고 생각합니다.
합의 크기가 정해져있을때 이들의 곱을 가장 크게 하는 방법은 값을 최대한 같게 하는 것 입니다. 만약 자연수라는 정의가 없었다면 각각이 s/n인경우가 가장 곱이 클것이지만 자연수여야 하기 때문에, s//n을 모든 배열에 뿌려준뒤, 남은만큼 배열의 뒤에서 부터 채워주었습니다. 이때 남은것은 무조건 나눈값n보다 작기 때문에 위와같이 식을 작성할 수 있습니다.
그리고 이때 if 인경우는 n이 s보다 커서 n개만큼 s를나눌수 없는 경우입니다. 이럴경우는 -1을 반환 해주었습니다.