📍 백준 28702번 - FizzBuzz 문제 C++
https://www.acmicpc.net/problem/28702
🧩문제 요약
- 한 줄에 숫자 또는 "Fizz", "Buzz", "FizzBuzz" 중 하나씩 최대 3줄 주어짐
- 마지막 줄에 이어지는 다음 수에 해당하는 출력을 하라는 문제
이 문제는 단순하지만 string을 어떻게 처리하는지에 따라 다양하게 표현 할 수 있는 것 같다.
🧾 내가 짠 코드
#include <iostream>
#include <string>
using namespace std;
string fizzbuzz(int n ){
if(n%15 == 0 ) return "FizzBuzz";
else if(n%3 == 0) return "Fizz";
else if(n%5 == 0) return "Buzz";
else return to_string(n);
}
int main(){
string a,b,c, answer;
int next_num;
cin >> a >> b >> c;
// a, b, c가 숫자인지 아닌지 판별
if(a!="FizzBuzz" && a!="Fizz" && a!="Buzz"){
next_num = stoi(a) +3;
}
else if(b!="FizzBuzz" && b!="Fizz" && b!="Buzz"){
next_num = stoi(b) +2;
}
else if(c!="FizzBuzz" && c!="Fizz" && c!="Buzz"){
next_num = stoi(c) +1;
}
answer = fizzbuzz(next_num);
cout << answer << "\n";
return 0;
}
🧾백준 상위 코드
#include <stdio.h>
#include <stdlib.h>
char str[3][9];
int main() {
int N;
for(int i=0; i<3; i++) {
scanf("%s", str[i]);
if(atoi(str[i])) {
N = atoi(str[i])+3-i;
}
}
if(N%3 != 0 && N%5 != 0) printf("%d", N);
if(N%3==0) printf("Fizz");
if(N%5==0) printf("Buzz");
👍 이 코드에서 배운점
✅ string 입력 받기
처음에 string을 어떻게 입력 받아야 할지 몰라서 이리저리 해메다가 cin을 사용하게 됬는데,
문제에서 최대 문자열의 길이는 8이라고 명시를 해줬기 때문에 string을 배열로 처리하는 것이 가능했다.
그래서 이렇게 str[3][9]로 문자열을 받을 수 있다는 것이 매우 신기!!
✅ atoi() 함수 사용하기
atoi함수를 사용하면 문자열을 숫자고 바꿀 수 있다.
내가 할 고 있는 변환 함수는 stoi()뿐이였는데 이거는 문자열로 저장되어 있는 숫자 (예를들어 11)과 같은 값들만 바꿀 수 있어서 답답했었다.
atoi()를 사용하면 문자는 0으로 반환되고 나머지 숫자들은 int형으로 바꿔주기 때문에 알아두면 유용히 사용할 수 있다.
이렇게 코드를 작성하면 코드 가독성도 좋고 쓸데없는 코드를 추가하지 않아도 된다.
🙃 백준에서 최상위에 있던 아래의 코드도 있었는데, 이 코드는 분석은 했지만 내가 아직 사용할 짬도 아니고 이렇게 구현하기에는 아직 지식이 부족하기 때문에 이렇게도 구현할 수 있구나 정도로 알아두려고 한다.
#include<stdio.h>
int i,n,c;
main(){
while(~(c=getchar())&&(48>c||c>57))if(c==10)n++;
do{i=i*10+c-48;}while(48<=(c=getchar())&&c<=57);i+=3-n;
if(i%3&&i%5)printf("%d",i);else{if(i%3==0)printf("Fizz");if(i%5==0)printf("Buzz");}
}
✔ getchar() :
- 입력을 char로 하나씩 받아 올 수 있는 함수.
- getchar()는 파일끝 (EOF)이면 -1을 리턴
- ~(-1) = 0 이기 때문에, 입력이 끝나면 while문 종료
✔ 48>c||c>57:
- 아스키 코드로 인수가 아닌 것을 조건으로 함.
- 48~57이 아스키코드로 인수
✔ c==10:
- 10은 아스키 코드에서 줄바꿈 문자 "\n"을 의미
✔ do{i=i*10+c-48;}while(48<=(c=getchar())&&c<=57);i+=3-n;
- do- while반복문 사용
- 무조건 한번은 실행되게 하기 위해 do-while을 사용
✔ i=i*10+c-48;
- C/C++에서 문자로 된 숫자를 실제 정수로 변환할 때 자주 쓰는 고전적인 방법
i | 지금까지 만들어진 숫자 (정수) |
c | 현재 입력된 문자 하나 (예: '5') |
c - 48 | 아스키 코드에서 숫자 변환 ('0'이 48, '1'이 49, ..., '9'이 57) |
i * 10 + ... | 자리수 올리기 + 새로운 숫자 추가 |
알고리즘...
아직도 갈길이 험하고도 멀다...
'하루 알고리즘 1문제 풀기' 카테고리의 다른 글
백준 1436번 - 영화감독 숌 문제 C++ (0) | 2025.04.01 |
---|---|
백준 1181번 - 단어 정렬 문제 C++ (0) | 2025.04.01 |
백준 10989문제 - 수 정렬하기 3 C++ (0) | 2025.03.31 |
백준 2569번 - 달팽이는 올라가고 싶다 C++ (0) | 2025.03.31 |
백준 15829번 - Hasing 문제 C++ (0) | 2025.03.28 |