
내가 생각했을때 문제에서 원하는부분
FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열이 한 줄에 하나씩 주어집니다.
각 문자열의 길이는 8 이하입니다.
입력이 항상 FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열에 대응됨이 보장됩니다.
연속으로 출력된 세 개의 문자열 다음에 올 문자열을 출력하세요.
여러 문자열이 올 수 있는 경우, 아무거나 하나 출력하세요.
내가 이 문제를 보고 생각해본 부분
main 메서드:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader 객체를 생성하여 사용자 입력을 읽을 준비를 한다.
String s1 = br.readLine();, String s2 = br.readLine();, String s3 = br.readLine();: 표준 입력으로부터 세 줄의 문자열을 각각 s1, s2, s3 변수에 저장한다.
long currentCount = 0;: currentCount는 s3가 나타내는 (또는 유추할 수 있는) 숫자 값을 저장할 변수이다.
문제에서 큰 숫자가 나올 수 있으므로 int 대신 long 타입을 사용하는 것이 안전한다.
현재 카운트 (currentCount) 계산 로직:
isNumeric(s3): 먼저 s3가 숫자인지 확인한다.
만약 s3가 숫자라면, 그 숫자가 바로 현재 카운트이므로 currentCount = Long.parseLong(s3);로 설정한다. (예: s3가 "11"이면 currentCount는 11)
else if (isNumeric(s2)): s3가 숫자가 아니라면, s2가 숫자인지 확인한다.
s2가 숫자라면, s3는 s2 다음 순서의 문자열이다.
따라서 currentCount는 s2의 숫자 값에 1을 더한 값이 된다. (예: s2가 "980804"이면 currentCount는 980805)
else: s3와 s2 모두 숫자가 아니라면, s1이 숫자인 경우이다. (s1, s2, s3 중 적어도 하나는 숫자로 나타낼 수 있다고 문제에서 보장된다.)
s1이 숫자라면, s3는 s1 다음다음 순서의 문자열이다.
따라서 currentCount는 s1의 숫자 값에 2를 더한 값이 된다. (예: s1이 "980803"이면 currentCount는 980805)
다음 숫자 (nextNum)에 대한 FizzBuzz 출력 로직:
currentCount를 통해 현재 연속된 세 문자열 중 가장 마지막에 오는 숫자를 파악했으므로, 이제 그 다음 숫자 (nextNum = currentCount + 1)에 대한 FizzBuzz 규칙을 적용한다.
nextNum % 3 == 0 && nextNum % 5 == 0: nextNum이 3의 배수이면서 5의 배수이면 "FizzBuzz"를 출력한다.
nextNum % 3 == 0: nextNum이 3의 배수이면 "Fizz"를 출력한다. (위 조건에서 5의 배수인 경우는 이미 걸러졌으므로, 이 경우는 3의 배수이면서 5의 배수가 아닌 경우이다.)
nextNum % 5 == 0: nextNum이 5의 배수이면 "Buzz"를 출력한다. (위 조건들에서 3의 배수이거나 15의 배수인 경우는 이미 걸러졌으므로, 이 경우는 5의 배수이면서 3의 배수가 아닌 경우이다.)
else: 위의 어떤 조건에도 해당하지 않으면, nextNum을 숫자로 그대로 출력한다.
br.close();: BufferedReader 사용이 끝났으므로 스트림을 닫아 자원을 해제한다.
isNumeric 헬퍼 메서드:
이 메서드는 특정 문자열 str이 유효한 숫자로 파싱될 수 있는지 확인한다.
try-catch 블록을 사용한다:
Long.parseLong(str): 문자열을 long 타입의 숫자로 변환하려고 시도한다.
변환에 성공하면 (예외가 발생하지 않으면) true를 반환한다.
만약 문자열이 숫자가 아니라서 변환에 실패하면 NumberFormatException이 발생하고 catch 블록으로 이동하여 false를 반환한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 28702번 문제
public class Main1238 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력 문자열 세 개를 읽습니다.
String s1 = br.readLine();
String s2 = br.readLine();
String s3 = br.readLine();
long currentCount = 0; // 현재 순서의 숫자를 저장할 변수 (long으로 선언하여 큰 숫자도 처리)
// 세 문자열 중 가장 마지막에 있는 숫자를 찾아 현재 카운트를 파악합니다.
// 역순으로 검사하여 가장 최근에 나온 숫자를 기반으로 계산합니다.
if (isNumeric(s3)) {
currentCount = Long.parseLong(s3);
} else if (isNumeric(s2)) {
currentCount = Long.parseLong(s2) + 1;
} else { // s1이 숫자이거나, 모두 "Fizz", "Buzz", "FizzBuzz"일 경우 s1을 기준으로 +2 합니다.
// (문제 보장: "입력이 항상 FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열에 대응됨이 보장됩니다.")
// 따라서 반드시 이전에 숫자가 있었다고 가정할 수 있습니다.
currentCount = Long.parseLong(s1) + 2;
}
// 다음에 출력될 숫자 (currentCount + 1)에 대한 FizzBuzz 규칙을 적용합니다.
long nextNum = currentCount + 1;
if (nextNum % 3 == 0 && nextNum % 5 == 0) {
System.out.println("FizzBuzz");
} else if (nextNum % 3 == 0) {
System.out.println("Fizz");
} else if (nextNum % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(nextNum);
}
br.close();
}
// 문자열이 숫자로만 이루어져 있는지 확인하는 헬퍼 함수
private static boolean isNumeric(String str) {
try {
Long.parseLong(str); // long으로 파싱을 시도하여 숫자인지 확인
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.