프로그래머스-최고의 집합

KHW·2021년 2월 18일
0

알고리즘

목록 보기
6/37

문제 : 최고의 집합

기본적인 내용

일단 문제가 좀 모호하다 느꼈다.
예를 들어서 자연수 2개로 이루어진 집합 중 합이 9가 되는 집합은 다음과 같이 4개가 있습니다. { 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 } 그중 각 원소의 곱이 최대인 { 4, 5 }가 최고의 집합입니다.
만약 최고의 집합이 존재하지 않는 경우에 크기가 1인 1차원 배열(list, vector) 에 -1 을 채워서 return 해주세요.

이게 다시 말해서 곱이 최대인 집합이 없이 집합이 1개만 있으면 이건 최고의 집합이 되는건가의 의문이 일단 들었는데 어떻게 결국 풀긴했다. (여러 시도는 했다...)

생각해야 할 것

모든 인원에게 균등하게 나누고 남는 것을 1개씩만 몇몇애들에게만 주기
ex) 23를 4명으로 나누려면 [5,6,6,6] 형태를 만들어야 한다.

즉, 23 % 4 = 3이 된 3명만 기존 균등히 나눈 5개에서 1씩 추가된 값을 얻을 수 있다.

이를 식으로 표현하면

`Math.floor(s%n)인 애들만 Math.floor(s/n)개에서 1개 씩 추가된 값을 얻는다.

그외의 n명에서 나머지 인원(n-Math.floor(s%n))들은 Math.floor(s/n)개를 얻을 수 있다.

이를 식으로 정리하면

for(let i=0;i<n-Math.floor(s%n);i++)
      arr.push(Math.floor(s/n))
for(let i=0;i<Math.floor(s%n);i++)
      arr.push(Math.floor(s/n)+1)

이렇게 정리된다.

예외사항

기존의 존재하는 자연수 s보다 n의 값이 더 크다면 (n마다 기본적으로 1이상도 나눠줄수 없다면) 최고의 집합을 구할 수 가 없으므로 맨앞에 예외처리를 해준다.

  if(n>s)
        	return [-1]

코드

function solution(n, s) {
    	let arr=[];
        if(n>s)
        	return [-1]

         for(let i=0;i<n-Math.floor(s%n);i++)
                arr.push(Math.floor(s/n))
         for(let i=0;i<Math.floor(s%n);i++)
                 arr.push(Math.floor(s/n)+1)
         return arr;
}

처음에는 별 생각없이 2개의 곱의 최대값만 생각했다가 쉽네 하고 큰코다쳤다.

느낀점

문제를 이해하는데 시간을 오래써야한다.
Math.floor, Math.round, Math.ceil을 헷갈리지 말고 쓰자.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글