https://www.acmicpc.net/problem/3447
버그 투성이 프로그램을 잘 만드는 백준이는 버그를 찾는 프로그램을 만들었다.
이 프로그램은 프로그램의 소스 코드를 입력으로 받은 뒤, 버그를 발견하면 해당 부분을 주석처리해준다.
하지만, 버그를 찾는 프로그램도 백준이가 작성했기 때문에 버그가 있다. 바로, 주석처리하는 대신에 그 부분을 BUG로 바꿔버린다.
버그 찾는 프로그램이 처리한 결과가 주어졌을 때, BUG를 모두 없애는 프로그램을 작성하시오.
입력은 여러 줄의 소스 코드로 이루어져 있다. 이 소스 코드는 백준이가 작성한 버그를 찾는 프로그램으로 이미 처리가 되어있다. 각 줄은 100글자 이내이고, 입력은 파일이 끝날 때 끝난다. 줄의 개수는 따로 제한을 두지 않는다.
입력으로 주어진 소스 코드의 BUG를 모두 제거한 뒤 출력한다. 출력하는 소스 코드에는 BUG가 있으면 안 된다. 즉, ABUBUGGB와 같은 경우는 AB가 되어야 한다.
예제 입력에서 "BUG"라는 글자를 찾아서 완전히 없앤 결과를 출력해준다.
#include <stdio.h>
#include <string.h>
int main()
{
char str[101];
char bug[] = "BUG";
// 입력받을 문자열이 없을 때까지 반복
while (fgets(str, 101, stdin) != NULL)
{
// BUG 문자열이 없을 때까지 반복
while (strstr(str, bug) != NULL)
{
// BUG 문자열 삭제 과정
strcpy(strstr(str, bug), strstr(str, bug) + 3);
}
printf("%s", str);
}
}
fgets(str, sizeof(str), stdin) 뜻
stdin(표준입력)으로부터 문자열을 입력받아서 배열 str에 저장하되, sizeof(str)의 길이만큼만 저장해라 라는 뜻이다.
문자열의 끝은 NULL(\0) 문자를 위한 공간이므로 sizeof(str) 크기를 +1로 해줘야 한다.
fgets() 함수는 \n도 문자열의 일부로 받아들인다!
strstr(str, bug) 뜻
str에서 배열 bug에 들어있는 "BUG"라는 문자열이 있는지 판단하는데, 있으면 해당 문자열을 찾은 최초의 위치(주소값)를 반환하고, 없으면 NULL을 반환한다.
strcpy(a, b) 뜻
b에 있는 문자열을 a에 집어 넣어 복사시킨다.
NULL 문자까지 포함하여 복사되므로 크기를 고려해줘야 한다.
크기가 101인 배열 str을 선언해주고, "BUG"라는 문자열이 들어있는 배열 bug를 선언해준다.
fgets() 함수로 문자열을 입력받고 배열 str에 크기 101까지 저장하는데, 무한반복문으로 더 이상 입력받은 문자열이 없거나 배열 공간이 꽉 찼을 때까지 반복해준다.
strstr() 함수로 배열 str에 배열 bug에 들어있는 문자열 "BUG"가 없을 때까지 무한반복문으로 반복해준다.
strstr() 함수로 찾은 "BUG"의 첫 부분의 위치 "B"를 strcpy() 함수를 이용하여 그 위치에 +3을 한 위치로 덮어씌워준다. 즉, "aBUGbc"가 있다면 "B"위치에 "G" 다음에 있는 +3을 한 위치인 "b"부터 쭉 복사되어 "abc"가 되도록 해준다.
이 문제 오래전에 풀어놓고 포스팅하기 너무 귀찮을 것 같아서 미루다가 이제서야 한다ㅎㅎㅠ 역시나 여러 함수를 찾아보고 정리해서 글을 쓰기엔 시간이 꽤 걸렸지만 그만큼 또 한 번 공부하는 느낌이라 좋았다!