Uknow's Lab.
article thumbnail

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

 

3447번: 버그왕

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

www.acmicpc.net

 

난이도 : 브론즈 1
태그 : 문자열, 파싱, 정규표현식

 

 

설명

"BUG" 문자열을 모두 찾아 없애는 문제입니다.

 

문자열의 전체 개수가 주어지지 않는데,

이는 fgets() 함수로 NULL이 나올때까지 받아 해결할 수 있습니다.

 

소스코드

 

#include <stdio.h>
#include <string.h>

int main() {
    char str[101];
    char bug[] = "BUG";

	// 더 이상 받을 문자열이 없을 때 까지 반복
    while (fgets(str, 101, stdin) != NULL) {
		
        // BUG 문자열이 더 이상 없을 때 까지 BUG 문자열을 지워 줌
        while (strstr(str, bug) != NULL) {
        	// BUG 문자열 삭제
            strcpy(strstr(str, bug), strstr(str, bug) + 3);
        }
        printf("%s", str);
    }
}

 

위에서 언급하였듯,

fgets를 사용해 더 이상 받을 문자열이 없을 때( == NULL)까지 반복합니다.

 

strstr(a, b) 함수는

a 문자열에서 b문자열의 시작부분부터의 포인터를 반환합니다.

    char str[] = "Hello World C Language";
    char *world = "World";
    printf("%s\n", strstr(str, world));

strstr(str,world)는 str의 "world" 이후의 문자열 포인터인 World C Language를 반환합니다.

또한, 포인터이기 때문에, strstr을 통해 받아온 문자열을 변환하면, 원래의 str 문자열도 변화합니다.

 

    char str[] = "Hello World C Language";
    char *world = "World";
    char *ptr = strstr(str, world);
    strcpy(ptr, "Korea");
    printf("%s", str);

Hello Korea

strcpy를 통해 문자열을 변환할 수 있습니다.

 

그렇다면, 특정 문자를 제거하기 위해선, 해당 문자열의 시작위치 +3 만큼 해서 strcpy를 하면 되겠죠?

            strcpy(strstr(str, bug), strstr(str, bug) + 3);

abcdefgBUGhijk 에서,

strstr(str,bug)를 통해 "BUGhijk"를 받아올 수 있습니다.

포인터이기 때문에, 이 문자열을 변경하면 원본 문자열도 변경됩니다.

받아온 포인터를 +3만큼 하면 hijk 부분만 받아올 수 있습니다.

 

따라서,

abcdefgBUGhijk 에서 BUGhijk 부분 중,

BUGhijk 부분을 hijk로 교체하면 원본 문자열에서 BUG를 없앨 수 있습니다.

 

 

 

후기

C언어는 손에 익은 언어가 아니다 보니 꽤 시간이 든 문제였습니다.

간만에 C언어 관련 함수를 여러개 찾아봤네요.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.