FizzBuzz는 매우 간단한 프로그래밍 문제이며, 규칙은 다음과 같다
- 1에서 100까지 출력
- 3의 배수는 Fizz 출력
- 5의 배수는 Buzz 출력
- 3과 5의 공배수는 FizzBuzz 출력
즉 컴파일하면 아래와 같은 화면이 나온다.
FizzBuzz 첫 트라이
아래는 내가 문제만 보고 짠 코딩이다
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0 && i % 15 != 0) // 3의 배수라면
printf("Fizz\n"); // Fizz 출력
else if (i % 5 == 0 && i % 15 != 0) // 5의 배수라면
printf("Buzz\n"); // Buzz 출력
else if (i % 15 == 0)
printf("FizzBuzz\n");
else if (i % 3 != 0 && i % 5 != 0 && i % 15 != 0)
printf("%d\n", i); // i 출력
}
return 0;
}
일단 3과 5의 배수에 맞게 FizzBuzz는 잘 실행이 된다.
하지만 문제점이 많다.
(문제점)
1. 3과 5의 공배수(FizzBuzz)가 나오지 않아 코드를 더럽게 짠 것.
2. 3과 5의 공배수를 내가 계산해서 15로 넣어버린 것.
3. 절차형 프로그래밍을 보다 깊게 이해하지 못해 FizzBuzz를 맨 아래로 보내버린 것.
2번 문제점의 경우에는 내 로직적 문제가 있었다.
사람이 계산할 일을 최대한 줄이는 것이 프로그래밍이라고 할 수 있는데 내가 계산해버렸다.
두번째 트라이
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0 && i % 5 == 0) // 3으로 나눈 값과 5로 나눈 값이 0이라면 (즉 3과 5의 공배수라면)
printf("FizzBuzz\n");
else if (i % 3 == 0) // 3의 배수라면?
printf("Fizz\n");
else if (i % 5 == 0) // 5의 배수라면?
printf("Buzz\n");
else
printf("%d\n", i);
}
return 0;
}
맨 처음 코드의 문제점을 해결했다.
- 절차형 프로그래밍을 고려하여 3과 5의 공배수인 FizzBuzz를 맨 앞에 세웠다.
- 3과 5의 공배수를 내가 계산하지 않고 프로그램이 계산하도록 만들었다.
- 위의 코드보다 훨~씬 가벼워졌다.
코드 골프 방식?
코드골프란 골프 경기와 마찬가지로 소스 코드의 문자 수를 최대한 줄여서 작성하는 놀이라고 한다...
굉장히 변태같다.
이건 내가 푼게 아니고 책에서 그대로 따온 것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
for (int i = 0; i++ < 100;) // 변화식을 조건식과 함께 for문에 넣어버렸다.
printf(i % 3 ? i % 5 ? "%d\n" : "Buzz\n" : i % 5 ? "Fizz\n" : "FizzBuzz\n", i);
return 0;
}
삼항연산자가 여러개나와서 당황했다.
하지만 postfix, prefix 정리하듯이 묶어버리면 생각보다 간단하다.
'C, C++' 카테고리의 다른 글
C언어 코딩도장(포인터 사용하기) (0) | 2022.04.29 |
---|---|
[C언어] 약수 구하기 (0) | 2022.04.28 |
C언어 코딩도장(goto 사용하기) (0) | 2022.04.28 |
[C언어] for문 별 찍기 2편 (0) | 2022.04.28 |
[C언어] for문 별 찍기 1편 (0) | 2022.04.27 |