문제

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"

문제 풀이

문제 접근

  • 간단히 쪼갤 수 있는 수 중, 차이가 가장 적은 수들의 조합을 선택하면 된다.
    1. 입력 검증:
    • ns보다 크면 균등하게 나눌 수 없으므로 배열에 -1을 담아서 반환한다.
      1. 배열 초기화:
    • 나눌 수 있는 기본 값 nums / n으로 계산한다.
    • 나머지 값 adds % n으로 계산한다.
      1. 큰 값 할당:
    • add 개수만큼 배열의 앞부분에 num + 1을 할당한다.
      1. 작은 값 할당:
    • 나머지 부분에는 num을 할당한다.
      1. 결과 반환:
    • 배열을 오름차순으로 정렬하여 반환한다.

간단한 수도 코드 정리

함수 solution(n, s) {
    만약 n > s 이면
        배열 answer에 -1을 넣고 반환
    
    배열 answer를 크기 n으로 초기화
    
    num을 s / n으로 설정 (기본 나눌 값)
    add를 s % n으로 설정 (나머지 값)
    
    add만큼 반복 {
        answer의 앞부분에 num + 1을 넣음
    }
    
    나머지 부분에 num을 넣음
    
    answer를 정렬
    
    answer 반환
}


풀이 코드

import java.util.*;

class Solution {
    public int[] solution(int n, int s) {
        int[] answer = {};
        
        if (n > s) {
            answer = new int[1];
            answer[0] = -1;
        } else {
            answer = new int[n];
            int num = 0; // s가 쪼개져서 나온 숫자
            int add = 0; // 쪼개고 남는 숫자
            
            num = s / n;
            add = s % n;
            System.out.println(add);
            
            for (int i = 0; i < add; i++) {
                answer[i] = num + 1;
            }
            for (int i = add; i < n; i++) {
                answer[i] = num;
            }
            
            Arrays.sort(answer);
        }
        
        return answer;
    }
}