[알고리즘]_그리디 알고리즘_부분 문자열(백준 No. 6550)

yerim·2023년 3월 1일
0

💡 Algorithm

목록 보기
15/19

문제

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


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


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


예제 입력 1

sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter

예제 출력 1

Yes
No
Yes
No


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class No_6550 {
	static String str;
	static int idx;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		while((str=br.readLine())!=null){//입력이 더 이상 들어오지 않을 때 까지요
			st=new StringTokenizer(str);
			String s=st.nextToken();
			String t=st.nextToken();

			idx=0;
			for(int i=0;i<t.length();i++){
				if(s.charAt(idx)==t.charAt(i)){ //첫번째문자열(s)와 두번째 문자열이 같다면 idx 증가
					idx++;
				}
				if(idx == s.length()) //idx가 첫 번째 문자열과 같다면 -> 첫번째 문자열, 두번째 문자열 똑같은거니깐
					break;
			}

			if(idx==s.length()){
				System.out.println("Yes");
			}

			else{
				System.out.println("No");
			}
		}
	}
}

풀이

  • while((str=br.readLine())!=null) : 입력이 들어올때까지 입력받는 코드
  • s: 첫 번째 문자열 t: 두 번째 문자열
  • 💡 문제조건: t에서 몇 개의 문자를 제거하고 순서를 바꾸지 않고 합쳤을 경우 s가되는 경우
    = 문자열의 순서를 바꾸면 안되고 제거만 할 수 있다.
  • if문으로 s의 문자열과 t의 문자열을 비교한다. s의 idx번째의 글자와 t의 i번째의 글자가 같다면 idx를 플러스 한다.
    이때 idx의 길이가 s의 길이와 같다면 멈춘다

마무리

  • 머리로는 생각이 나는데 막상 하려고 하면 까먹음 힝

0개의 댓글