문제
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다.
남아있는 문자가 없는 경우가 있다.
이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다.
문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
해결 방법
- 2초에서 틀렸습니다가 나옴
- 폭발 문자열의 각각의 문자로 입력문자열에서 같은 것들을 다 없애버렸기 때문
- 폭발 문자열은 '문자열'이다. 문제 이해 잘못해서 나온 결과
- contains와 replace를 사용해봄
- 메모리 초과 발생
- replace를 할 때마다 String 객체를 새로 생성하기 때문에 낭비되는 메모리가 많다.
- Stack을 사용해야 한다는 글을 봄
- 입력문자열을 끝에서부터 char로 stack에 넣음
- stack의 길이가 폭탄과 같거나 길어지고 폭탄 문자열의 첫 문자와 stack.peek이 같으면
- flag = true
- stack의 나머지 값들과 폭탄 문자열의 나머지 값들을 비교해서 같지 않으면 flag = false
- 같으면 -> 같은 문자열이라는 뜻이기 때문에 stack에 쌓여있는 폭잔 문자열을 없애버림
- 이것을 입력 문자열 길이만큼 반복
- stack이 비어있으면 FRULA 출력
- 비어있지 않으면 stack 안의 문자를 문자열로 출력
public class Week02_9935 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); Stack<Character> stack = new Stack<>(); String s = br.readLine(); String bomb = br.readLine(); // 문자열 안의 폭탄문자열을 삭제하는 로직 for (int i = s.length() - 1; i >= 0; i--) { stack.push(s.charAt(i)); if (stack.size() >= bomb.length() && bomb.charAt(0) == stack.peek()) { boolean flag = true; for (int j = 1; j < bomb.length(); j++) { if (stack.get(stack.size() - 1 - j) != bomb.charAt(j)) { flag = false; } } if (flag) { for (int k = 0; k < bomb.length(); k++) { stack.pop(); } } } } if(stack.isEmpty()) bw.write("FRULA"); while (!stack.isEmpty()) { bw.write(stack.pop()+""); } bw.flush(); bw.close(); br.close(); } }
'algorithm' 카테고리의 다른 글
| [BOJ] 9095. 1,2,3 더하기 (0) | 2022.10.28 |
|---|---|
| [BOJ] 10819. 차이를 최대로 (0) | 2022.10.27 |
| [BOJ] 1764. 듣보잡 (0) | 2022.10.21 |
| [BOJ] 17298. 오큰수 (0) | 2022.10.21 |
| [BOJ] 2309. 일곱 난쟁이 (0) | 2022.10.21 |