본문 바로가기
알고리즘/백준

[백준 28702] FizzBuzz (C++)

by fortissimo 2024. 9. 10.

문제


FizzBuzz 문제는 𝑖=1,2,⋯ 에 대해 다음 규칙에 따라 문자열을 한 줄에 하나씩 출력하는 문제입니다.

  •  𝑖가 3의 배수이면서 5의 배수이면 “FizzBuzz”를 출력합니다.
  •  𝑖가 3의 배수이지만 5의 배수가 아니면 “Fizz”를 출력합니다.
  •  𝑖가 3의 배수가 아니지만 5의 배수이면 “Buzz”를 출력합니다.
  •  𝑖가 3의 배수도 아니고 5의 배수도 아닌 경우 𝑖를 그대로 출력합니다.

FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열이 주어집니다. 이때, 이 세 문자열 다음에 올 문자열은 무엇일까요?

입력


 FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열이 한 줄에 하나씩 주어집니다. 각 문자열의 길이는 8 이하입니다. 입력이 항상 FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열에 대응됨이 보장됩니다.

 

출력


연속으로 출력된 세 개의 문자열 다음에 올 문자열을 출력하세요. 여러 문자열이 올 수 있는 경우, 아무거나 하나 출력하세요.

 

문제 풀이


수학 문제.

 

i가 3의 배수이면 Fizz이거나 FizzBuzz이다. 연속된 3개의 문자열이 주어지므로 3개 중 하나는 3의 배수이게 되므로 Fizz 혹은 FizzBuzz가 된다. 그러면 나머지 2개는 3의 배수가 아니게 되는데,두 개 다 5의 배수가 될 수 없으므로 하나는 i가 출력된다.

다시 말해 항상 3개의 문자열 중 하나는 적어도 3의 배수도 5의 배수도 아니어서 i가 그대로 출력된다.

 

세 문자열을 확인해 i인 문자열에 적절히 +3, +2, +1 하여 세 문자열의 다음 숫자를 얻어온 후, 이를 규칙에 맞게 FizzBuzz, Fizz, Buzz, i 중 하나를 출력해주면 된다.

 

세 문자열 중 하나는 항상 제대로 i가 출력되므로 어떤 한 입력에 대해 답은 유일하다.

 

아래는 코드.

더보기
#include <iostream>
#include <string>
using namespace std;

void print(int N)
{
	if (N % 3 == 0 && N % 5 == 0)
	{
		cout << "FizzBuzz" << "\n";
	}
	else if (N % 3 == 0)
	{
		cout << "Fizz" << "\n";
	}
	else if (N % 5 == 0)
	{
		cout << "Buzz" << "\n";
	}
	else
	{
		cout << N << "\n";
	}
}

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	string str1, str2, str3;
	cin >> str1;
	cin >> str2;
	cin >> str3;
	if (str3 != "FizzBuzz" && str3 != "Fizz" && str3 != "Buzz")
	{
		print(stoi(str3) + 1);
	}
	else if (str2 != "FizzBuzz" && str2 != "Fizz" && str2 != "Buzz")
	{
		print(stoi(str2) + 2);
	}
	else
	{
		print(stoi(str1) + 3);
	}
	return 0;
}