하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 6550 C언어

긤효중 2022. 2. 26. 01:34

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

 

6550번: 부분 문자열

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문자열 s 와 t가 빈칸을 사이에 두고 들어온다. s와 t의 길이는 10만을 넘지 않는다.

www.acmicpc.net


문제

2개의 문자열 s와 t가 주어졌을 때 s가 t의 부분 문자열인지 판단하는 프로그램을 작성하라. 부분 문자열을 가지고 있는지 판단하는 방법은 t에서 몇 개의 문자를 제거하고 이를 순서를 바꾸지 않고 합쳤을 경우 s가 되는 경우를 이야기 한다.


입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문자열 s 와 t가 빈칸을 사이에 두고 들어온다. s와 t의 길이는 10만을 넘지 않는다.


출력

입력된 s와 t의 순서대로 s가 t의 부분 문자열인 경우 Yes라 출력하고 아닐 경우 No라고 출력한다.


해결방안->

문자열이 subsequence이고 부분문자열이 sequence라고 해보자.

s u b s e q u e n c e에 대해서 검사를 하는데 처음 index변수를 0으로 넣어보자 .(이때 부분문자열[index]는 s이다)

 

문자열 길이만큼 i를 돌리면서

 

만약 부분문자열[index]가 문자열[i]가 같다면 index를 증가시킨다.

처음 문자열이 i일때 's'와 부분문자열 index의 's'는 같으므로 index를 증가시킨다

index : 0->1

그럼 다음 부분문자열은 e가 된다 부분문자열[1].

마찬가지로 부분문자열[1]가 문자열[i]와 같다면 index를 증가시킨다.

 

만약 index값이 문자열의 길이라면 s가 t의 부분문자열이고, 그렇지 않다면 부분 문자열이 아니다.

입력은 파일의 끝인EOF일떄까지 받는다


전체 소스코드->

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

 

int main(void){
    char arr[100000];
    char sub_arr[100000];
   
    while(scanf("%s %s",sub_arr,arr)!= EOF){
        int idx = 0;
        for(int i = 0;i<strlen(arr);i++){
            if(arr[i] == sub_arr[idx]){    
                idx++;
            }
        }
        if(idx != strlen(sub_arr)){
            printf("No\n");
        }
        else{
            printf("Yes\n");
        }
    }
}

 

'알고리즘' 카테고리의 다른 글

백준 주유소 C언어  (0) 2022.03.20
백준 1946 신입사원 C언어  (0) 2022.02.28
백준 14921 C언어  (0) 2022.02.25
백준 1316 C언어  (0) 2022.02.23
백준 14905 C언어  (0) 2022.02.20