title: "코딩테스트 연습 - 최고의 집합"
image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg"
description: "자연수 n 개로 이루어진 중복 집합(multi set, 편의상 이후에는 ”집합”으로 통칭) 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다."
url: "https://school.programmers.co.kr/learn/courses/30/lessons/12938"
문제 풀이
문제 접근
간단히 쪼갤 수 있는 수 중, 차이가 가장 적은 수들의 조합을 선택하면 된다.
입력 검증:
n이 s보다 크면 균등하게 나눌 수 없으므로 배열에 -1을 담아서 반환한다.
배열 초기화:
나눌 수 있는 기본 값 num을 s / n으로 계산한다.
나머지 값 add를 s % n으로 계산한다.
큰 값 할당:
add 개수만큼 배열의 앞부분에 num + 1을 할당한다.
작은 값 할당:
나머지 부분에는 num을 할당한다.
결과 반환:
배열을 오름차순으로 정렬하여 반환한다.
간단한 수도 코드 정리
함수 solution(n, s) {
만약 n > s 이면
배열 answer에 -1을 넣고 반환
배열 answer를 크기 n으로 초기화
num을 s / n으로 설정 (기본 나눌 값)
add를 s % n으로 설정 (나머지 값)
add만큼 반복 {
answer의 앞부분에 num + 1을 넣음
}
나머지 부분에 num을 넣음
answer를 정렬
answer 반환
}
풀이 코드
importjava.util.*;classSolution{publicint[]solution(intn,ints){int[]answer={};if(n>s){answer=newint[1];answer[0]=-1;}else{answer=newint[n];intnum=0;// s가 쪼개져서 나온 숫자intadd=0;// 쪼개고 남는 숫자num=s/n;add=s%n;System.out.println(add);for(inti=0;i<add;i++){answer[i]=num+1;}for(inti=add;i<n;i++){answer[i]=num;}Arrays.sort(answer);}returnanswer;}}