본문 바로가기
Algorithm/Programmers

[Programmers] Lv.0 | 피자 나눠 먹기 (3) | Java

by unknownomad 2025. 11. 4.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120816

 

풀이

class Solution {
    public int solution(int slice, int n) {
        int answer = n / slice;
        
        if (n % slice != 0) {
            answer++;
        }
        
        return answer;
    }
}
class Solution {
    public int solution(int slice, int n) {
        return (n + slice - 1) / slice;
    }
}
  • 정수 나눗셈에서 올림을 구현하는 고전적인 패턴
    (n + slice - 1) / slice
    → n이 slice로 나누어떨어지지 않으면 자동으로 올림 처리됨

예시 확인:

  • slice=7, n=10 → (10 + 6) / 7 = 16 / 7 = 2
  • slice=4, n=12 → (12 + 3) / 4 = 15 / 4 = 3

기본 개념: 정수 나눗셈의 특징

  • 자바(Java)에서 정수끼리 나누면 소수점 아래는 버려짐(내림)
  • 자바의 /는 내림 나눗셈
10 / 7 = 1   // 1.xxx 이지만 .xxx 버림
12 / 4 = 3
13 / 4 = 3   // 3.25 → 소수점 이하 버림

 

우리가 원하는 건 “올림” 나눗셈

n명이 있고, 한 판에 slice 조각이 있다면, 한 사람당 한 조각 이상 먹으려면 n조각 이상 필요함, 그럼 몇 판을 시켜야 할까?

  • n / slice를 계산했을 때 딱 떨어지면 그게 답
  • 하지만 딱 안 떨어지면 한 판 더 시켜야 함
slice  n  실제 계산 올림한 결과 필요한 피자 수
7 10 10 ÷ 7 = 1.428… 2 2판
4 12 12 ÷ 4 = 3.0 3 3판
4 13 13 ÷ 4 = 3.25 4 4판

그런데 자바는 올림이 아니라 내림만 됨, 그래서 올림을 직접 만들어줘야 함
그 방법이 바로 (n + slice - 1) / slice

 

왜 (n + slice - 1) 이걸 더하는지?

예시 1: slice = 7, n = 10

(10 + 7 - 1) / 7 = 16 / 7 = 2

👉 결과 = 2

그럼 왜 7 - 1을 더했을까?

n = 10일 때, 단순히 10 / 7 하면 결과가 1
(1.428 → 소수점 버려짐)

그런데 우리는 소수점이 조금이라도 있으면 한 판 더 시켜야 함

그래서 slice - 1, 즉 6을 더해줌

이렇게 하면 나누기 전에 살짝 보정이 되어서, 정수 나눗셈을 써도 올림 효과가 남

 

수학적으로 보면

ceil(n / slice) 는 “n을 slice로 나눈 뒤 올림한 값”

근데 정수 계산에서는 ceil(a / b)를 아래처럼 바꿀 수 있음

ceil(a / b) = (a + b - 1) / b ← 단, a,b가 양수일 때만 성립(수학적 트릭)

 

예시로 검증

n  slice  n/slice 올림  (n + slice - 1)/slice
10 7 1.428 2 (10 + 6) / 7 = 16 / 7 = 2
12 4 3.0 3 (12 + 3) / 4 = 15 / 4 = 3
13 4 3.25 4 (13 + 3) / 4 = 16 / 4 = 4

 

한 줄 정리

(n + slice - 1) / slice

= 정수 나눗셈에서 올림(ceil) 을 흉내내는 방법

= “딱 안 나누어떨어질 땐 한 판 더”를 자동으로 계산해줌

댓글