Koder / 박성훈
article thumbnail

C++17 백준 컴파일러가 gets를 지원 안해서 좀 골치아픈 문제.

fgets로 해결했다 일단.

 

www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net

fgets를 통해 문자열을 받고

단어가 등장하는걸 확인한 경우에는 단어의 길이만큼 인덱스를 건너뛰게 하는 방법으로

중복을 막았다.

 

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

char arr[3456] = {0};
char input[123] = {0};

bool compare(int idx, char *s1, char *s2){
	bool ret = 1;
	int length = strlen(s2)-1;
	for(int i=0; i<length; i++){
		if(s2[i] != s1[idx+i]){ ret = 0; break; }
	}
	return ret;
}

int main(){
	int ans = 0;
	fgets(arr, 3000, stdin);
	fgets(input, 55, stdin);
	
	int l1 = strlen(arr)-1;
	int l2 = strlen(input)-1;
	
	if(l1 < l2){
		printf("0");
		return 0;
	}
	
	for(int i=0; i<=l1-l2;){
		if(compare(i, arr, input)){
			i+=l2;
			ans++;
		}
		else i++;
	}
	printf("%d", ans);
	return 0;
}

compare함수는 그냥 문자열이 같은지를 판별하는 함수이다.

 

for문을 l1-l2만큼만 실행시킨 이유는

비교과정에서 세그폴트가 발생할수도 있기 때문이다.

그래서 배열도 넓게 잡았다.

else문으로 i++을 뺀 이유는 i+=L2를 계산하고도 ++되어서

인덱스가 하나씩 밀리는 문제가 있었기 때문이다.

 

반응형