
https://www.acmicpc.net/problem/28702
FizzBuzz는 1부터 시작해서
3의 배수면 "Fizz"
5의 배수면 "Buzz"
15의 배수면 "FizzBuzz"
그 외는 숫자 그대로 출력하는 방식이다.
이 문제에서는 FizzBuzz 수열에서 연속된 3개의 항이 주어지고,
그 다음 항을 출력해야 한다.
Fizz
Buzz
11
이렇게 입력되면, 다음 항은 Fizz가 된다.
처음에는 입력이 "Fizz", "Buzz", "11" 이렇게 주어지길래
"왜 출력이 Fizz 하나밖에 없지?" 라는 의문이 들었다.
하지만 문제의 핵심은 입력으로 주어진 3개의 항 중 반드시 하나는 정수이며,
그 정수를 기준으로 전체 수열의 위치를 계산할 수 있다는 것이다.
입력에서 숫자 하나만 찾으면 된다.
예를 들어 11이 3번째 줄이라면 (0-based index 2),
FizzBuzz 수열에서 3번째 항이 11이라는 의미니까
11 - 2 = 9 → 수열의 시작값은 9라는 걸 알 수 있다.
즉,
start = num - index
다음 항 = start + 3
이 값을 FizzBuzz 규칙에 맞게 출력하면 끝!
using System;
class Program
{
static void Main()
{
string[] input = new string[3];
for (int i = 0; i < 3; i++)
input[i] = Console.ReadLine();
int start = -1;
for (int i = 0; i < 3; i++)
{
if (int.TryParse(input[i], out int num))
{
start = num - i;
break;
}
}
int next = start + 3;
Console.WriteLine(GetFizzBuzzValue(next));
}
static string GetFizzBuzzValue(int num)
{
if (num % 15 == 0) return "FizzBuzz";
if (num % 3 == 0) return "Fizz";
if (num % 5 == 0) return "Buzz";
return num.ToString();
}
}
처음엔 Fizz, Buzz, FizzBuzz 같은 문자열들을 분석해야 하나 고민했지만,
숫자가 반드시 하나 있다는 조건을 이용하면 매우 간단하게 풀 수 있었다.
괜히 복잡하게 생각하면 오히려 풀이가 꼬일 수 있다.
핵심 조건을 정확히 읽는 게 훨씬 중요하다는 걸 다시 느꼈다.
int.TryParse()를 통해 문자열이 숫자인지 확인 가능
문제를 단순화시킬 수 있는 조건을 잘 파악하자