코딩테스트/그리디

최고의 집합

수타. 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을 반환 해주었습니다.