[C]백준_3447 : 버그왕

Alal11·2023년 3월 4일
0
post-thumbnail

출처

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);
	}
}

✍️scanf()와 gets(), fgets() 차이!

  • Hello World!를 scanf()로 입력받으면 공백을 인식 못해서 Hello까지만 입력된다.
  • gets(), fgets()는 공백 포함해서 Hello World! 모두 입력된다. (단, 줄바꿈 \n은 fgets()만 받아들인다.)
  • gets()는 마련해놓은 배열의 길이를 넘어서게 되면 할당 받지 않은 메모리 공간을 침범할 수도 있기 때문에 크기를 지정해줄 수 있는 fgets()의 사용을 권장한다.

✍️fgets() 함수~ 문자열 입력하기

fgets(str, sizeof(str), stdin) 뜻

  • 첫 번째 매개변수 : 문자열이 저장될 포인터
  • 두 번째 매개변수 : 입력받을 문자열의 길이
  • 세 번째 매개변수 : 입력받을 스트림을 지정

stdin(표준입력)으로부터 문자열을 입력받아서 배열 str에 저장하되, sizeof(str)의 길이만큼만 저장해라 라는 뜻이다.
문자열의 끝은 NULL(\0) 문자를 위한 공간이므로 sizeof(str) 크기를 +1로 해줘야 한다.
fgets() 함수는 \n도 문자열의 일부로 받아들인다!


✍️strstr() 함수~ 문자열 검색하기

strstr(str, bug) 뜻

str에서 배열 bug에 들어있는 "BUG"라는 문자열이 있는지 판단하는데, 있으면 해당 문자열을 찾은 최초의 위치(주소값)를 반환하고, 없으면 NULL을 반환한다.


✍️strcpy() 함수~ 문자열 복사하기

strcpy(a, b) 뜻

b에 있는 문자열을 a에 집어 넣어 복사시킨다.
NULL 문자까지 포함하여 복사되므로 크기를 고려해줘야 한다.


➡️코드 분석

  1. 크기가 101인 배열 str을 선언해주고, "BUG"라는 문자열이 들어있는 배열 bug를 선언해준다.

  2. fgets() 함수로 문자열을 입력받고 배열 str에 크기 101까지 저장하는데, 무한반복문으로 더 이상 입력받은 문자열이 없거나 배열 공간이 꽉 찼을 때까지 반복해준다.

  3. strstr() 함수로 배열 str에 배열 bug에 들어있는 문자열 "BUG"가 없을 때까지 무한반복문으로 반복해준다.

  4. strstr() 함수로 찾은 "BUG"의 첫 부분의 위치 "B"를 strcpy() 함수를 이용하여 그 위치에 +3을 한 위치로 덮어씌워준다. 즉, "aBUGbc"가 있다면 "B"위치에 "G" 다음에 있는 +3을 한 위치인 "b"부터 쭉 복사되어 "abc"가 되도록 해준다.


➡️end

이 문제 오래전에 풀어놓고 포스팅하기 너무 귀찮을 것 같아서 미루다가 이제서야 한다ㅎㅎㅠ 역시나 여러 함수를 찾아보고 정리해서 글을 쓰기엔 시간이 꽤 걸렸지만 그만큼 또 한 번 공부하는 느낌이라 좋았다!

0개의 댓글