일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- python
- SECS-II
- spotify
- Computer Science
- SECS
- 백준
- SW Expert Academy
- linux
- Baekjoon
- 회귀
- 자바
- 파이썬
- modern c++
- spring boot
- Spotify Api
- 회원가입
- Spring
- Gem
- java
- C++
- CS
- c
- SWEA
- 프로그래머스
- regression
- programmers
- Spring JPA
- 스포티파이
- MYSQL
- SECS/GEM
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 9935 문자열 폭발 (JAVA) 본문
728x90
https://www.acmicpc.net/problem/9935
문제
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
예제 입력 1 복사
mirkovC4nizCC44
C4
예제 출력 1 복사
mirkovniz
예제 입력 2 복사
12ab112ab2ab
12ab
예제 출력 2 복사
FRULA
- 원본 문자열의 길이 N(1이상 1백만 이하), 비교 문자열의 길이 M(1이상 36이하) 일 때, 원본 문자열을 한 번 순회하면서 비교 문자열을 지우는 작업은 O(NM)의 시간 복잡도를 가진다.
- O(NM)의 복잡도가 수없이 반복되기 때문에 제한시간을 맞출 수 없다. 따라서 문자열을 순회하면서 비교 문자열과 비교하는 작업을 병행한다.
- 원본 문자열을 저장할 자료구조는 StringBuilder나 Stack 그 외 List와 같은 mutable 구조를 사용하면 된다.
- 어떤 자료구조를 사용하든 간에 남은 원본 문자열을 출력해야 하므로 StringBuilder가 다른 자료구조에 비해 빠르다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
// stack 사용
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String origin = br.readLine();
String remove = br.readLine();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < origin.length(); i++) {
stack.push(origin.charAt(i));
if (stack.size() >= remove.length()) {
boolean flag = true;
for (int j = 0; j < remove.length(); j++) {
if (stack.get(stack.size() - remove.length() + j) != remove.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
for (int j = 0; j < remove.length(); j++) {
stack.pop();
}
}
}
}
StringBuilder sb = new StringBuilder();
for(char ch : stack) {
sb.append(ch);
}
System.out.println(sb.length() > 0 ? sb.toString() : "FRULA");
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[SOFTEER 소프티어] 623 비밀메뉴 (JAVA) (0) | 2022.05.05 |
---|---|
[SOFTEER 소프티어] 624 전광판 (JAVA) (0) | 2022.05.05 |
[BAEKJOON 백준] 3020 개똥벌레 (JAVA) (0) | 2022.05.05 |
[BAEKJOON 백준] 11660 구간 합 구하기 5 (JAVA) (0) | 2022.05.05 |
[BAEKJOON 백준] 16235 나무 재테크 (JAVA) (0) | 2022.04.30 |
Comments