-
[백준/BOJ] 5555번 : 반지 _C언어알고리즘/백준(BOJ) 2022. 2. 4. 20:00728x90반응형
https://www.acmicpc.net/problem/5555
>접근방법
(방법1)
문자열이 같아지는 부분의 인덱스를 변수에 저장하고 그 부분부터 문자열 끝까지 다 맞으면 count 를 더해준다. 다르면 반복문을 나와 다시 검사한다. 문제에서 반지는 처음과 끝이 연결되어 있기 때문에 끝에서 처음으로 문자열이 연결되어있는 경우를 생각해서 조건문을 설정했다. 문자열 최대 길이가 10이기 때문에 10 - '문자열길이' 가 j 보다 작을 경우 j를 0으로 보내준다.
(방법2)
찾으려는 문자열이 반지의 끝과 처음의 경계에 걸쳐있을 경우를 생각해서 반지 문자열을 두 줄로 복사해서 새 배열에 담는다(예. "ABCXXYYYYY" -> "ABCXXYYYYYABCXXYYYYY"). 그 배열을 반복문으로 문자열이 있는지 검사한다. 이때 문자열 검색 함수인 strstr()함수를 이용한다.
>알고리즘
(방법1)
1. 입력 문자열 개수만큼 첫 번째 for문 반복
2. 문자열의 첫 문자가 같아지는 인덱스를 j에 저장
3. strRing[j]부터 나머지 문자열도 같으면 count 증가
4. 예외1) 반지의 경계에 문자열이 걸쳐있을 경우의 if문을 추가한다.
5. 예외2) 문자열의 중간부분까지만 같은 경우의 if문을 추가한다.
(방법2)
1. 입력받은 문자열 반지 배열을 두 줄로 복사 예) "ABCXXYYYYY" -> "ABCXXYYYYYABCXXYYYYY"
2. strstr함수 이용
3. 문자열 있으면 count 증가
>코드
(방법1) - 오류
#include <stdio.h> #include <string.h> char str[50]; int num, i, j, k; //j: 같은문자 시작 인덱스, K: 문자열 전체 같은지 검사 char strRing[50]; int count=0; int main(void){ scanf("%s", str); scanf("%d", &num); int len = strlen(str); for(i=0; i<num; i++){ scanf("%s", strRing); //반지 j=0; for(; strRing[j] != str[0]; j++){ } for(k=0; k<len; k++){ //str 길이만큼 반복 if(j>(10-len) && j == 10){ // 문자열이 경계에 걸쳐 있을 때 j=0; k--; } else if(strRing[j] == str[k]){ j++; } else{ k=0; } } if(len==k){ count++; } } printf("%d\n", count); return 0; }
미완성 코드.. 언젠가는 꼭 완성시켜야지
(방법2)
#include <stdio.h> #include <string.h> // 알고리즘 /* 1. 입력받은 문자열 복사 2. strstr함수로 문자열 확인 */ char str[50]; char strRing2[50]; int num, i, j; char strRing[50]; int count=0; int main(void){ printf("시작"); scanf("%s", str); scanf("%d", &num); for(i=0; i<num; i++){ scanf("%s", strRing); int lenRing = strlen(strRing); for(j = 0; j<lenRing; j++){ strRing2[j] = strRing[j]; strRing2[j+10] = strRing[j]; } char* ptr = strstr(strRing2, str); if(ptr != NULL){ count++; } } printf("%d\n", count); return 0; }
>결과
>결론
<string.h> 라이브러리에 strstr() 이라는 문자열을 검색해주는 좋은 함수가 있었다.
같은 문제는 이틀까지만 생각하기로 했는데 3일이나 써버렸다. 결국 해결해서 기분은 좋다만, 다음부턴 문제를 놓아주는 법을 좀 배워야겠다.
오늘의 교훈: 머리가 나쁘면 몸이 고생한다. 앞으로는 적당한 함수가 있는지 먼저 알아보고 알고리즘을 짜자.
LIST'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준/BOJ] 3986번 : 좋은 단어 _C/C++ (0) 2022.02.15 [백준/BOJ] 10773번 : 제로 _C/C++ (0) 2022.02.14 [백준/BOJ] 9012번 : 괄호 _C언어 (0) 2022.02.13 [백준/BOJ] 10798번 : 세로읽기 _C언어 (0) 2022.02.13 [백준/BOJ] 1652번 : 누울 자리를 찾아라 _C언어 (0) 2022.02.10