본문 바로가기

문제 풀이/Baekjoon

[백준] S5 14405번 피카츄 (JAVA)

문제 출처 - Baekjoon Online Judge

문제는 여기

 

14405번: 피카츄

피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다. 문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문

www.acmicpc.net

[문제] 

피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다.

문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문자열인지 아닌지 구하는 프로그램을 작성하시오.

[입력]

첫째 줄에 문자열 S가 주어진다. 문자열은 알파벳 소문자로 이루어진 문자열이며, 길이는 5000을 넘지 않는다.

[출력]

문자열 S가 "pi", "ka", "chu"를 이어 붙여서 만들 수 있으면 "YES"를 아니면 "NO"를 출력한다.

 

 


[풀이]

1. 입력받은 문자열에서 "pi", "ka", "chu"인 경우 다 지워준다.

2. 지워진 문자열이 빈 문자열이라면 "YES"를 출력해주고 아니라면 "NO"를 출력해준다.

[접근]

1. replace를 사용해서 "pi", "ka", "chu"인 경우 다 공백으로 바꿔주는 것으로 접근하였다.

2. 이 경우 먼저 지워진 문자에 따라서 뒤에 문자가 지워지는 문제가 발생해 접근이 틀렸었다.

3. replaceAll을 사용해 해당 경우를 한 번에 처리를 해주고 빈 문자열이라면 "YES"를 출력해주고 아니라면 "NO"를 출력해준다.

[코드]

replace를 썼을 때 (오답)

package BOJ_silver;

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

public class Main_S5_14405 {
	static String str;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		str = br.readLine();
		
		str = str.replace("pi", "");
        	str = str.replace("ka", "");
        	str = str.replace("chu", "");

		if (str.equals(""))
			System.out.println("YES");
		else
			System.out.println("NO");
	}
}

이 방법으로 하였을 때 kpia 같은 경우 pi가 먼저 사라지고 ka가 다음으로 사라지기 때문에 no가 출력되어야 하지만 yes로 출력이 되었다. 이를 해결할 방법이 필요했다.

 

replaceAll를 사용했을 때 (정답)

package BOJ_silver;

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

public class Main_S5_14405 {
	static String str;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		str = br.readLine();
		
		str = str.replaceAll("pi|ka|chu", "");

		if (str.equals(""))
			System.out.println("YES");
		else
			System.out.println("NO");
	}
}