출처: https://school.programmers.co.kr/learn/courses/30/lessons/120816
문제 설명
머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
제한사항
2 ≤ slice ≤ 10
1 ≤ n ≤ 100
입출력 예
slice n result
7 10 2
4 12 3
입출력 예 설명
입출력 예 #1
10명이 7조각으로 자른 피자를 한 조각 이상씩 먹으려면 최소 2판을 시켜야 합니다.
입출력 예 #2
12명이 4조각으로 자른 피자를 한 조각 이상씩 먹으려면 최소 3판을 시켜야 합니다.
내가 작성한 코드문
def solution(slice, n):
answer = 0
if n % slice == 0:
answer = n // slice
elif n % slice != 0:
answer = n // slice + 1
return answer
다른 사람의 풀이
def solution(slice, n):
return ((n - 1) // slice) + 1
((n−1)//slice)+1 공식은 프로그래밍에서 올림 연산 (Ceiling)을 구현하는 간결한 방법 중 하나다.
def solution(slice, n):
d, m = divmod(n, slice)
return d + int(m != 0)
몫과 나머지 계산 (divmod(n, slice))
"몫과 나머지를 정확히 나눠서 처리하는" 방식이다.
d, m = divmod(n, slice) (나눗셈):
n을 slice로 나눠서 몫 (d)과 나머지 (m)를 구합니다.
몫 (d): 피자가 꽉 차게 필요한 판수.
나머지 (m): 피자를 못 먹은 남은 사람 수.
예시 1: 7명(n=7), 6조각(slice=6) → 몫 1, 나머지 1
예시 2: 12명(n=12), 6조각(slice=6) → 몫 2, 나머지 0
int(m != 0) (나머지가 있는지 확인):
나머지 (m)가 0이 아니라면 (사람이 남았다면) → True → 정수 1로 변환.
나머지 (m)가 0이라면 (사람이 안 남았다면) → False → 정수 0으로 변환.
d + int(m != 0) (총 판수):
몫 (d)에 추가 판수 (0 또는 1)를 더한다.
예시 1: 판 (남은 1명을 위해 1판 추가)
예시 2: 판 (남은 사람이 없으므로 추가 필요 없음)
from math import ceil
def solution(slice, n):
return ceil(n/slice)
수학 라이브러리인 math 모듈의 ceil (천장 함수, 올림)을 사용하여 피자 판수를 계산
n (사람) slice (조각) n/slice (나눗셈) ceil(n/slice) (올림) 필요한 판수
7 6 7/6≈1.166 2 1판으로는 부족하니 2판 필요
12 6 12/6=2.0 2 딱 2판으로 모두에게 줄 수 있음
13 6 13/6≈2.166 3 2판으로는 부족하니 3판 필요
올림 함수
코드: ceil(n/slice)
장점: 가장 직관적이고 명확함. 코드가 간결함.
단점: math 모듈을 import 해야 함.
나머지 이용
코드: d + int(m != 0)
장점: math 모듈 없이 가장 논리적으로 올림 처리.
단점: divmod 함수나 몫/나머지 계산이 필요함.
트릭 이용
코드: ((n - 1) // slice) + 1
장점: math 모듈 없이 가장 짧게 올림 처리 가능.
단점: 왜 작동하는지 이해하기 가장 어려움.