Uknow's Lab.
article thumbnail

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

 

3447번: 버그왕

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

www.acmicpc.net

 

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

 

 

1. 설명

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

 

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

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

 

2. 소스코드

 

<cpp />
#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문자열의 시작부분부터의 포인터를 반환합니다.

<cpp />
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 문자열도 변화합니다.

 

<cpp />
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를 하면 되겠죠?

<cpp />
strcpy(strstr(str, bug), strstr(str, bug) + 3);

abcdefgBUGhijk 에서,

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

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

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

 

따라서,

abcdefgBUGhijk 에서 BUGhijk 부분 중,

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

 

 

 

3. 후기

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

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

profile

Uknow's Lab.

@유노 Uknow

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