본문 바로가기

문제 풀이/Baekjoon

[백준] S5 6550번 부분 문자열 (JAVA)

문제 출처 - Beakjoon Online Judge

문제는 여기

 

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라고 출력한다.

 

 


[풀이]

1. s문자열과 t문자열을 입력받아 s문자열을 각 문자 별로 비교를 한다.

2. 모든 문자 체크가 끝나면 해당하는 결과를 출력한다.

[접근]

1. s문자열의 각 자리가 t에 순서대로 있는지 체크하면 된다.

2. for문으로 t의 각 문자열을 순차적으로 체크하며 s의 자리와 같다면 s의 자리를 증가시켜주면 된다고 생각하고 이를 코드로 구현하였다.

[코드]

package BOJ_silver;

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

public class Main_S5_6550 {
	static String str;
	static int idx;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st;
		
		while((str = br.readLine()) != null) {
			st = new StringTokenizer(str);
			
			String s1 = st.nextToken();
			String s2 = st.nextToken();
			
			idx = 0;
			
			for (int i = 0; i < s2.length(); i++) {
				if (s1.charAt(idx) == s2.charAt(i)) {
					idx++;
				}
				if (idx == s1.length())
					break;
			}
			
			if (idx == s1.length())
				System.out.println("Yes");
			else
				System.out.println("No");
		}
	}
}