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)의 위치다.
if와 else 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;
}