N Log

FizzBuzz

문제

1부터 100까지의 정수를 차례대로 출력한다.
이때 3의 배수는 Fizz, 5의 배수는 Buzz, 3과 5의 공배수는 FizzBuzz로 출력한다.

출력의 일부는 다음과 같다.

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

오답

간단한 문제이지만, 문제의 조건을 그대로 나열해 조건문을 작성하면 두 가지 실수를 하기 쉽다.

if (num % 3 == 0)
    printf("Fizz\n");
else if (num % 5 == 0)
    printf("Buzz\n");
else if (num % 3 == 0 && num % 5 == 0)
    printf("FizzBuzz\n");

첫 번째 문제는 else if (num % 3 == 0 && num % 5 == 0)의 위치다.
ifelse if는 위에서부터 조건을 순서대로 검사하므로,
num이 15라면 첫 번째 조건문에서 이미 참이 되어 Fizz를 출력하고 조건문을 빠져나간다.
따라서 3과 5의 공배수인지 확인하는 조건을 가장 먼저 검사해야 한다.

두 번째는 공배수 조건의 표현 방식이다.
num % 3 == 0 && num % 5 == 0도 논리적으로 올바른 조건이지만, 3과 5의 배수 여부를 각각 확인하고 있다.
3과 5의 최소공배수는 15이므로, num % 15 == 0으로 같은 조건을 더 간결하게 표현할 수 있다.

정답

#include <stdio.h>

int main(void)
{
    for (int num = 1; num <= 100; num++)
    {
        if (num % 15 == 0)
            printf("FizzBuzz\n");
        else if (num % 3 == 0)
            printf("Fizz\n");
        else if (num % 5 == 0)
            printf("Buzz\n");
        else
            printf("%d\n", num);
    }

    return 0;
}