N Log

프로그래머스 입문 120814 피자 나눠 먹기 1

문제

출처

피자 한 판은 7조각이다.
조각 피자는 판매하지 않는다.
사람 수 n이 1 이상 100 이하로 주어질 때 필요한 피자 판 수를 반환하라.

n 필요한 피자 판 수
6 1
7 1
8 2

풀이

올림 나눗셈으로 계산하기

int solution(int n)
{
    return (n + 6) / 7;
}

C에서 정수끼리 나누면 소수점 이하는 버려진다.
예를 들어 6 / 70이지만, 실제로는 피자가 1판 필요하다.
8 / 71이지만, 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이 된다.

예를 들어 77 / 71이고, 7 % 7 != 0이 거짓이므로 0을 더해 1이 된다.
88 / 71이고, 8 % 7 != 0이 참이므로 1을 더해 2가 된다.