[Gold IV] 문자열 폭발 - 9935
성능 요약
메모리: 39504 KB, 시간: 372 ms
분류
자료 구조, 스택, 문자열
제출 일자
2023년 12월 13일 15:34:52
문제 설명
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
잘못된 풀이
1. 주어진 문자에서 폭탄 문자들이 사라질 때까지 전부 replaceAll해줬다.
2.이런 방식으로 문제를 푼다면 메모리초과가 발생함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder word = new StringBuilder(br.readLine());
String exp = br.readLine();
// 주어진 문자열에서 폭탄 문자가 없어질 때 까지 계속 제거해줌
while (word.toString().contains(exp)) {
int idx = word.indexOf(exp);
word.delete(idx, idx + exp.length());
}
System.out.println(word.toString().isEmpty() ? "FRULA" : word);
}
}
올바른 풀이
1. 문자를 넣어주면서 폭탄 문제열이 들어올 수 있다면(길이가 크거나 같을 때) 바로 제거해준다.
2. 문자를 제거 해준 뒤 StringBuilder에 넣어준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine();
String bomb = br.readLine();
// bomb.length()는 많이 쓰이기 때문에 bombLen 변수로 만들어준다.
int bombLen = bomb.length();
// 값을 넣어줄 stack
Stack<Character> stack = new Stack<>();
for (char ch : word.toCharArray()) {
// 들어온 ch를 push
stack.push(ch);
// ch사이즈가 bombWord보다 같거나 크면 bombCheck메서드 실행
if (stack.size() >= bombLen && bombCheck(stack, bomb,bombLen)) {
// 만약 bomb단어가 있다면 bomb길이만큼 폭탄을 제거해줌
for(int i = 0; i < bombLen; i++){
stack.pop();
}
}
}
// iterator방식으로 사용하기 때문에 reverse할 필요없이 바로 삽입해주면 됨
StringBuilder sb = new StringBuilder();
for (char ch : stack) {
sb.append(ch);
}
System.out.println(sb.length() == 0 ? "FRULA" : sb);
}
// stack에 마지막으로 들어온 문자들이 bomb크기만큼 확인 후 같다면 true 다르다면 false
private static boolean bombCheck(Stack<Character> stack, String bomb, int bombLen) {
for(int i = 0; i < bombLen; i++){
if (stack.get(stack.size() - bombLen + i) != bomb.charAt(i)) {
return false;
}
}
return true;
}
}
'알고리즘 - Baekjoon > Gold' 카테고리의 다른 글
[백준] 2661번 : 좋은수열 Gold4(골드4) - JAVA[자바] (0) | 2023.12.17 |
---|---|
[백준] 15686번 : 치킨 배달 Gold5(골드5) - JAVA[자바] (0) | 2023.12.16 |
[백준] 124-번 : 노드사이의 거리 Gold5(골드5) - JAVA[자바] (1) | 2023.12.12 |
[백준] 2668번 : 숫자고르기 Gold5(골드5) - JAVA[자바] (0) | 2023.12.12 |
[백준] 1963번 : 소수 경로 Gold4(골드4) - JAVA[자바] (0) | 2023.11.28 |