프로그래머스 입문 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이지만, 실제로는 피자가 2판 필요하다.
n + 6을 먼저 계산하면 피제수가 커져 몫이 바뀌는 구간이 앞당겨진다.
정수 나눗셈에서 몫이 바뀌는 구간은 7개씩이지만, 6을 더하면 그 경계가 앞당겨져 1 ~ 7에서는 몫이 1이 되고, 8 ~ 14에서는 몫이 2가 된다.
이는 7로 나누어떨어지는 수는 피제수에 6을 더해도 몫이 그대로이고, 7로 나누어떨어지지 않는 수는 몫이 1 증가하기 때문이다.
아래 그림과 표에서 n / 7과 (n + 6) / 7의 몫이 바뀌는 구간을 비교해 보자.
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
q = quotient
n / 7에서 n의 범위 |
n / 7의 몫 |
(n + 6) / 7에서 n의 범위 |
(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);
}
피자 한 판마다 7명으로 이루어진 그룹이 하나씩 만들어진다고 생각해 보자.
n / 7은 7명으로 이루어진 그룹을 몇 개 만들 수 있는지 구한다.
n % 7은 어느 그룹에도 들어가지 못하고 남는 사람 수를 구한다.
남는 사람이 있다면 피자 한 판을 더 주문해야 한다.
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가 된다.