프로그래머스 입문 120814 피자 나눠 먹기 1
문제
피자 한 판은 7조각이다.
조각 피자는 판매하지 않는다.
사람 수 n이 1 이상 100 이하로 주어질 때 필요한 피자 판 수를 반환하라.
| n | 필요한 피자 판 수 |
|---|---|
| 6 | 1 |
| 7 | 1 |
| 8 | 2 |
풀이
올림 나눗셈으로 계산하기
int solution(int n)
{
return (n + 6) / 7;
}
C에서 정수끼리 나누면 소수점 이하는 버려진다.
예를 들어 6 / 7은 0이지만, 실제로는 피자가 1판 필요하다.
8 / 7도 1이지만, 8명이 먹으려면 피자가 2판 필요하다.
n + 6을 먼저 계산하는 이유는 정수 나눗셈에서 올림 효과를 만들기 위해서다.
7로 나누어떨어지는 수는 피제수에 6을 더해도 몫이 그대로이고, 나머지가 있는 수는 피제수에 6을 더하면 몫이 1 증가한다.
다르게 보면 n + 6은 정수 나눗셈의 구간을 앞으로 당기는 것으로 볼 수도 있다.
n / 7
0 1 2 3 4 5 6 | 7 8 9 10 11 12 13 | 14 15 16 17 18 19 20
q 0 | q 1 | q 2
(n + 6) / 7
0 | 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 | 15 16 17 18 19 20 21
q 0 | q 1 | q 2 | q 3
세로로 보면 몫이 바뀌는 시작점이 앞으로 이동한 것을 더 쉽게 볼 수 있다.
| n / 7의 구간 | n / 7의 몫 | (n + 6) / 7의 구간 | (n + 6) / 7의 몫 |
|---|---|---|---|
| 0 ~ 6 | 0 | 0 | 0 |
| 7 ~ 13 | 1 | 1 ~ 7 | 1 |
| 14 ~ 20 | 2 | 8 ~ 14 | 2 |
| 21 ~ 27 | 3 | 15 ~ 21 | 3 |
나머지가 있으면 한 판 더하기
int solution(int n)
{
return n / 7 + (n % 7 != 0);
}
n / 7은 7명씩 몇 개의 완전한 그룹을 만들 수 있는지 구한다.
n % 7은 완전한 그룹에 들어가지 못한 사람 수를 구한다.
완전한 그룹에는 완전한 그룹 수만큼 피자를 주면 된다.
그러나 완전하지 않은 그룹이 하나라도 있다면 피자를 한 판 더 주문해야 한다.
나머지는 항상 7보다 작으므로 추가로 필요한 피자는 없거나 1판이다.
C에서 비교식의 결과는 참이면 1, 거짓이면 0이다.
그래서 (n % 7 != 0)은 남은 사람이 있으면 1, 없으면 0이 된다.
예를 들어 7은 7 / 7이 1이고, 7 % 7 != 0이 거짓이므로 0을 더해 1이 된다.
8은 8 / 7이 1이고, 8 % 7 != 0이 참이므로 1을 더해 2가 된다.