코딩테스트 & 문제 풀이

[C]백준_3447 : 버그왕

Hicecream 2024. 2. 3. 23:57

2023년 3월 4일에 작성됨

 

https://www.acmicpc.net/problem/3447

 

3447번: 버그왕

입력은 여러 줄의 소스 코드로 이루어져 있다. 이 소스 코드는 백준이가 작성한 버그를 찾는 프로그램으로 이미 처리가 되어있다. 각 줄은 100글자 이내이고, 입력은 파일이 끝날 때 끝난다. 줄의

www.acmicpc.net

 

 

문제 분석

예제 입력에서 "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

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