코딩테스트 대비/백준 알고리즘

BOJ - 19939 박 터트리기

JellyApple 2024. 10. 9. 00:53

문제 링크 : https://www.acmicpc.net/problem/19939

문제 티어: 실버 4

문제 유형: 그리디 알고리즘

문제 풀이 

: N개의 공을 K개의 바구니에 나눠 담아야 하지만 담기는 공의 갯수는 모두 다르게 해야하고 또한 차이는 최소여야 한다는 것이다. 

: 그리디 알고리즘으로 1개씩 공을 다 넣고  Max(공의 갯수) - Min(공의 갯수) 가 최소여야 한다는 것

: 일단 1개씩 공을 다 줌 => 공 남으면 다시 첫 번째로 가서 주고 계속 반복 => 만약 공 다 줬는데 같은 수 있으면 넘어가고 없으면 Max - Min을 해준다.

: 최소 필요한 공 갯수 => 1 + 2 + .... + k = k * (k+1) / 2 

:  만약 공 부족해서 못 나눠주는 경우 console.log(-1);

: 남은 공 수 : remainBalls = N - minBalls

: 만약 남은 공 수가 k로 나누어 떨어진다 => 모든 바구니에 하나씩 줄 수 있다는 점 => k-1개로 차이 유지

ex) n = 9 , k = 3  , minBalls = 1 + 2 + 3 = 6 , n - minBalls = 3 % 3 === 0 => 나누어 떨어짐 = 공 하나씩 줄 수있음 => 차이는 벌어지지 않음

: 만약 남은 공 수가 k로 나누어 떨어지지 않는다면 => 모든 바구니에 하나씩 다 줄 수 없다는 점 => 하나가 늘어나 k개로 크차이 증가 

 

문제 코드

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split(" "); // 공백을 기준으로 나눠서
let [n, k] = input.map(Number);

// 최소 공의 갯수 계산
let minBalls = K * (K+1) / 2;

// 만약 n이 최소 공의 갯수보다 작으면 나눌 수 없으므로 -1 출력
if(n<minBalls){
    console.log(-1);
} else {
     const remainBalls = n - minBalls;
     if(remainBalls % k === 0){
          console.log(k-1);
       } else {
           console.log(k);
           }
 }