백준 문풀

백준 5555

조강학 2024. 3. 15. 01:32

실버 5

#include<stdio.h>
int find_ring(int count, char s[], char ring[]) {
	int s_len = 0;
	while (1) {
		if (s[s_len] == '\0' || s[s_len] == '\n')
			break;
		s_len++;
	}

	int i, j,n;
	for (i = 0, j = 0,n=0; n < s_len+10; i++) {
		if (ring[i % 10] == s[j]) {
			j++;
			if (j == s_len)
				break;
		}
		else {
			j = 0;
			i = ++n;
		}
	}

	if (s_len == j)
		return ++count;
	else return count;
}
int main() {
	int count, num;
	char s[11];
	char ring[11];
	count = 0;
	scanf("%s", s);
	scanf("%d", &num);
	for (int k = 0; k < num; k++) {
		scanf("%s", ring);
		count = find_ring(count, s, ring);
	}
	printf("%d", count);
}

 

반례를 찾는 과정이 어려웠다...,

반지의 리스트를 선형이 아닌 순환 구조로 찾아야 했다.

ababc문자열을 찾을 경우 

adadadc라면 인식을 못해 문제가 됐었다.

그래서 조금 시간이 오래 걸리더라도 반지의 인덱스 0~9, 1~-1,,,,로 하나씩 대조하여 찾도록 하였고

그러한 이유에서 반복문의 실행 횟수를 (현재 반지의 인덱스< 찾고자하는 문자열의 길이+10) 으로 설정하였다.

>>방금 알아낸 사실인데 n<11로 하는 것이 더 나은 방법이다,, s_len을 더한것은 의미가 없는 덧셈이엿군..

아무튼 fing_ring 함수에선 찾고자하는 문자열의 길이를 먼저 저장한 다음 ,j가 그 길이가 되었을 때, 즉 찾고자하는 문자열의 끝까지 검사를 실행하게 되었고 검사가 성공했을때 루프를 탈출하거나 아닌경우 루프를 탈출하지 못해 count의 반환 값이 달라지도록 하였다. 

 

 

'백준 문풀' 카테고리의 다른 글

백준 11478  (0) 2024.05.06
백준 11279  (0) 2024.05.06
백준 7785  (0) 2024.05.06
백준 2908  (2) 2024.03.15
백준 1152  (0) 2024.03.10