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언어 관련 함수를 여러개 찾아봤네요.
'코딩테스트 > C | C++' 카테고리의 다른 글
[백준 3595번] [C언어] 맥주 냉장고 (1) | 2022.12.02 |
---|---|
[백준 2520번] [C언어] 팬케이크 사랑 (0) | 2022.11.29 |
[백준 4158번] [C언어] CD (0) | 2022.11.28 |
[백준 8979번] [C] 올림픽 (0) | 2022.11.15 |
[백준 9339번] [C] 마라토너 (0) | 2022.11.15 |