본문 바로가기

Programming/C

[ProjectH4C] 코딩도장 Unit 33 Write-Up

FizzBuzz

FizzBuzz는 프로그래밍 문제이다. 규칙은 다음과 같다.

  • 1에서 100까지 출력
  • 3의 배수는 Fizz 출력
  • 5의 배수는 Buzz 출력
  • 3과 5의 공배수는 FizzBuzz 출력

위의 규칙을 모두 적용시켜서 작성해보면 코드는 다음과 같다.

 

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 100; i++)      // 1부터 100까지 100번 반복
    {
        if (i % 3 == 0 && i % 5 == 0)   // 3과 5의 공배수일 때
            printf("FizzBuzz\n");       // FizzBuzz 출력
        else if (i % 3 == 0)            // 3의 배수일 때
            printf("Fizz\n");           // Fizz 출력
        else if (i % 5 == 0)            // 5의 배수일 때
            printf("Buzz\n");           // Buzz 출력
        else
            printf("%d\n", i);          // 아무것도 해당되지 않을 때 숫자 출력
    }

    return 0;
}

먼저 i가 3의 배수이면서 5의 배수인지(공배수인지) 확인한다. 공배수라면 FizzBuzz를 출력한다. 그렇지 않다면 만약 3의 배수라면 Fizz를, 5의 배수라면 Buzz를 출력해주고, 모두 해당하지 않는다면 숫자를 출력해주는 코드이다. 이 때, 3의 배수인지 5의 배수인지 확인하기 전에 3과 5의 공배수인지 확인해 준 이유는 만약 3의 배수인지 확인하는 코드를 먼저 작성한다면, i가 15일 때 3의 배수이기 때문에 Fizz만 출력하고 넘어가기 때문에 공배수인지 먼저 확인해주어야 한다. 위의 코드는 3과 5의 공배수인지 확인하기 위해 논리 연산자 &&를 이용해서 표현하였지만, &&를 사용하지 않고 공배수를 직접 구해서 i%15==0과 같이 작성해도 된다. 위와 같이 작성하면 if문이 4개나 작성되지만, 삼항 연산자를 이용해 코드의 길이를 확 줄일 수 있다.

printf(i%3 ? i%5 ? "%d \n" : "Buzz \n" : i%5 ? "Fizz \n" : "FizzBuzz \n", i);

 위의 4개의 if문을 삼항 연산자를 연속적으로 사용해서 한 줄로 줄인 코드이다. 이를 코드 골프 방식이라 부르는데, 비교적 적은 타수로 승리하는 골프게임에서 유래된 말로, 소스코드의 문자 수를 최대한 줄여서 작성하는 방식이다.

 

 

 

#33.6 퀴즈

 

x의 배수는 x로 나누었을 때 나머지가 0이 된다. 4의 배수는 4로 나누었을 때 나머지가 0이므로, 확인하는 방법으로는 i % 4 == 0이 된다. 답은 c.

 

i가 4의 배수이고 8의 배수이면 4와 8의 공배수이다. 이를 논리 연산자 &&를 사용하면 i%4==0 && i%8==0이 되는데, 이때 4와 8의 공배수는 8이므로 %4를 확인해 줄 필요없이 i%8==0만 확인해주면 된다. 답은 c, e.

 

 

#33.7 연습문제: 2와 7의 배수, 공배수 처리하기

#include <stdio.h>
 
int main()
{
    for (int i = 1; i <= 100; i++)
    {
        if (①_________________________)
            printf("FizzBuzz\n");
        else if (②__________)
            printf("Fizz\n");
        else if (③__________)
            printf("Buzz\n");
        else
            printf("%d\n", i);
    }
    return 0;
}

실행 결과

... (생략)
95
Fizz
97
FizzBuzz
99
Fizz

 

1. 2와 7의 공배수인지 확인해주어야 한다. 답은 i%2==0 && i%7 == 0 또는 i%14==0

2. 2의 배수인지 확인해야 한다. 답은 i%2==0

3. 7의 배수인지 확인해야 한다. 답은 i%7==0

 

#33.8 심사문제: 5와 11의 배수, 공배수 처리하기

앞서 배운 내용을 토대로 작성하면 된다. 단, 5와 11의 최소공배수는 55이므로, i%5==0 && i%11==0 대신 i%55==0으로 작성하였다. 코드는 다음과 같다. 

#include <stdio.h>

int main(){
  int x, y;
  scanf("%d %d", &x, &y);

  for(int i=x; i<=y; i++){
    if(i%55==0)
      printf("FizzBuzz \n");
    else if(i%5==0)
      printf("Fizz \n");
    else if(i%11==0)
      printf("Buzz \n");
    else
      printf("%d \n", i);
  }

  return 0;
}