본문 바로가기
PS/BOJ

백준 14405 자바, 파이썬 - 피카츄 (boj 14405 java, python)

by Nahwasa 2022. 3. 29.

문제 : boj14405

 

1. 직접 찾아보자!

  우선 정규식을 사용하지 않고 직접 찾는걸 확인해보자. 간단히 생각해서, 문자열에서 "pi", "ka", "chu"를 모두 나올 수 없는 문자로 변경해보자! 예를들어 "piakapichu"를 확인해보자.

이제 변경되지 못하고 남는 'a'가 보인다. 따라서 'NO'를 출력하면 된다. '&'만 있었다면 'YES'를 출력하면 된다.

그냥 삭제하지 않고 저렇게 자리를 남겨두는 이유는 'cpihu' 와 같은 경우 때문이다. 이 때 위 처럼 문자를 남긴다면 'c&hu'가 되어 chu를 변경할 수 없지만, 그냥 삭제하면 'chu'가 되므로 변경될 수 있다. 즉 올바른 답을 찾을 수 없다.

 

위와 같은 방식으로 짠 코드는 '코드1'에서 볼 수 있다.

 

 

2. 정규식을 사용해 찾아보자!

  정규식으로 써본다면 더 간단하다. "(pi|ka|chu)*" 정도면 된다! 'pi' 또는 'ka' 또는 'chu'가 0번 이상 반복됨을 의미한다. 정규식을 사용해 짠 코드는 자바는 '코드2', 파이썬은 '코드3' 에서 볼 수 있다.

 

 

코드1 (자바 - 직접 찾는 버전)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] data = new String[] {
			"pi"
			,"ka"
			,"chu"
		};
		
		StringBuffer str = new StringBuffer(br.readLine());
		int availableCheck = str.length();
		
		for (int i = 0; i < data.length; i++) {
			while (true) {
				int idx = str.indexOf(data[i]);
				if ( idx == -1 )
					break;
				str.replace(idx, idx + data[i].length(), ",");
				availableCheck -= data[i].length();
			}
		}
		
		if (availableCheck == 0)
			bw.write("YES\n");
		else
			bw.write("NO\n");

		bw.flush();
		br.close();
		bw.close();		
	}	
}

 

 

 

코드2 (자바 - 정규식 사용 버전)

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        String regex = "^(pi|ka|chu)*$";
        System.out.println(str.matches(regex)?"YES":"NO");
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

 

 

 

코드3 (파이썬 - 정규식 사용 버전)

import re

regex = re.compile('(pi|ka|chu)*')
str = input()

if re.fullmatch(regex, str) :
    print("YES")
else:
    print("NO")

댓글