알고리즘/백준

[백준] 6550번 부분 문자열 - 자바

danalee252 2022. 10. 9. 22:04
 

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

 

예제 입출력

 

문제풀이

이 문제는 단순 구현으로 풀었다. 문자열 s와 t를 문자배열인 CharArray로 쪼갠 후, 반복문을 돌면서 s의 모든 문자가 t 안에 순서대로 들어있는지 체크했다. 

테스트 케이스의 개수를 알려주지 않기 때문에 EOF 입력 처리를 해주어야 했다.

* 인텔리제이에서 EOF는 cmd+D (Ctrl + D)로 입력한다.

 

정답코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line);
            String s = st.nextToken();
            String t = st.nextToken();
            if (isSubstring(s, t)) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }

        }
    }

    static boolean isSubstring(String sub, String text) {
        int idx = 0;
        char[] textCharArray = text.toCharArray();
        for (char c : sub.toCharArray()) {
            while (true) {
                if (idx == textCharArray.length) {
                    return false;
                }
                if (textCharArray[idx] == c) {
                    idx++;
                    break;
                }

                idx++;
            }
        }

        return true;
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1743번 음식물 피하기 - 자바  (0) 2022.10.13
[백준] 14725번 개미굴 - 자바  (0) 2022.10.10
[백준] 3190번 뱀 - 자바  (0) 2022.10.08
[백준] 11399번 ATM - 자바  (1) 2022.10.07
[백준] 13023번 ABCDE - 자바  (0) 2022.10.07