본문 바로가기

백준 문제풀이

[Baekjoon 28702] FizzBuzz - Java

728x90

[Bronze I] FizzBuzz - 28702

문제 링크

성능 요약

메모리: 14372 KB, 시간: 108 ms

분류

수학, 문자열

제출 일자

2025년 2월 22일 17:52:20

문제 설명

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

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

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

입력

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

출력

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

문제 풀이

주어진 i값 다음에 올 숫자를 구하는 문제다.

다만 i 다음에 올 숫자가 3의 배수나 5의 배수인 경우에 Fizz나 Buzz를 출력하면 된다.

우선, 주어진 문자 i에는 숫자가 1개 이상 들어온다.

3번의 문자가 주어지는데 이 중 숫자로 1번 이상 입력을 받는다.

이를 통해 아래와 같이 i 다음에 올 숫자를 구할 수 있다.

  • 1번째 Buzz, 2번째 Fizz, 3번째 7을 입력받을 경우
    • 3번째로 숫자를 입력받았으니 +1을 한 8이 다음 숫자가 된다.
  • 1번째 8, 2번째 Fizz, 3번째 Buzz를 입력받을 경우
    • 1번째로 숫자를 입력받았으니 +3을 한 11이 다음 숫자가 된다.

숫자가 j번째로 나왔을 경우 3 - j을 더한 값이 다음에 올 숫자가 된다는것을 알 수 있다.

이런식으로 다음에 올 숫자를 구하고 3, 5로 나눠지는지 확인하여 Fizz, Buzz, FizzBuzz 유무를 확인하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] arr = new String[3];
        int nextNum = 0;

        for (int i = 0; i < 3; i ++) {
            arr[i] = br.readLine();
            if (checkNum(arr[i])) {
                nextNum = (Integer.parseInt(arr[i]) + (3 - i));
            }
        }
        System.out.println(checkFizzBuzz(nextNum));
    }

    public static boolean checkNum(String str) {
        if (str.matches("[+-]?\\d*(\\.\\d+)?")) {
            return true;
        }
        return false;
    }

    public static String checkFizzBuzz(int nextNum) {
        if (nextNum % 3 == 0 && nextNum % 5 == 0) {
            return "FizzBuzz";
        }
        else if (nextNum % 3 == 0) {
            return "Fizz";
        }
        else if (nextNum % 5 == 0){
            return "Buzz";
        }

        return Integer.toString(nextNum);
    }
}

코드 풀이

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] arr = new String[3];
        int nextNum = 0;

        for (int i = 0; i < 3; i ++) {
            arr[i] = br.readLine();
            if (checkNum(arr[i])) {
                nextNum = (Integer.parseInt(arr[i]) + (3 - i));
            }
        }
        System.out.println(checkFizzBuzz(nextNum));
    }
  • arr에 문자열 3개를 입력받을 용도로 String형으로 선언하고, nextNum에는 3의 배수, 5의 배수를 확인하기 위해 int형으로 선언했다.
  • for를 통해 3개의 문자열을 입력받으면서, checkNum 함수를 통해 문자열이 숫자인지 확인한다.
    • 숫자라면 String이기 때문에 int형으로 바꿔서 i번째 다음에 올 숫자를 구한다.
    • 이때 추후에 다음에 올 숫자가 3, 5의 배수인지 확인을 위해 int로 바꿔준다.
    public static boolean checkNum(String str) {
        if (str.matches("[+-]?\\d*(\\.\\d+)?")) {
            return true;
        }
        return false;
    }
  • 문자열이 숫자인지 확인하기 위해 정규식을 사용했다.
    public static String checkFizzBuzz(int nextNum) {
        if (nextNum % 3 == 0 && nextNum % 5 == 0) {
            return "FizzBuzz";
        }
        else if (nextNum % 3 == 0) {
            return "Fizz";
        }
        else if (nextNum % 5 == 0){
            return "Buzz";
        }

        return Integer.toString(nextNum);
    }
  • i번째 다음에 올 숫자가 3, 5 배수인지 확인하기 위한 함수다.
  • String 함수기 때문에 3, 5 배수가 아니더라도 toString으로 형변환을 해서 리턴했다.
728x90