반응형
9953번 문자열 폭발
1. 이해하기
- 폭발 문자열이 발견되면 그 문자열을 없애버려야 한다.
- 스택의 개념을 쓰는 문제이다.
- 가장 중요한 String +연산은 시간과 메모리가 많이 쓰인다는 것을 알아야 한다.
2. 전체 코드
-
주석의 코드를 실행하면 시간이 오래 걸린다. 그 이유가 모든 문자에 대해서 print를 하는데 시간이 걸리기 때문이다.(추측)
-
이를 줄이기 위해서는 StringBuilder를 사용하면 된다.
package algo; // //import java.io.BufferedReader; //import java.io.IOException; //import java.io.InputStreamReader; // //public class Acm9935 { // static char[] cStk = new char[1000000]; // static int cStkIdx = -1; // static char[] str; // public static void main(String[] args) throws IOException { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // str = br.readLine().toCharArray(); // char[] bomb = br.readLine().toCharArray(); // int now = 0; // for(int i = 0; i < str.length; i++) { // if(bomb[now] == str[i]) { // now++; // cStk[++cStkIdx] = str[i]; // if(now == bomb.length) { // for(int j = 0; j < now; j++) { // cStkIdx--; // } // now = 0; // for(int j = cStkIdx-bomb.length; j <= cStkIdx; j++) { // if(j < 0) continue; // if(cStk[j] == bomb[now]) { // now++; // } else { // now = 0; // if(bomb[now] == cStk[j]) // now++; // } // } // } // // } else { // now = 0; // if(bomb[now] == str[i]) // now++; // cStk[++cStkIdx] = str[i]; // } // } // if(cStkIdx == -1) // System.out.println("FRULA"); // else { // for(int i = 0; i <= cStkIdx; i++) // System.out.print(cStk[i]); // } // } //}
package algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Acm9935_문자열폭발 {
static int[] stk = new int[1000000];
static char[] cStk = new char[1000000];
static int stkIdx = -1;
static int cStkIdx = -1;
static char[] str;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
str = br.readLine().toCharArray();
String bomb = br.readLine();
int now = 0;
for (int i = 0; i < str.length; i++) {
if (bomb.charAt(now) == str[i]) {
now++;
stk[++stkIdx] = now;
cStk[++cStkIdx] = str[i];
if (now == bomb.length()) {
for (int j = 0; j < now; j++) {
stkIdx--;
cStkIdx--;
}
if (stkIdx != -1)
now = stk[stkIdx];
else
now = 0;
}
} else {
now = 0;
if (bomb.charAt(now) == str[i])
now++;
stk[++stkIdx] = now;
cStk[++cStkIdx] = str[i];
}
}
if (cStkIdx == -1)
System.out.println("FRULA");
else {
for (int i = 0; i <= cStkIdx; i++)
System.out.print(cStk[i]);
}
}
}
4. 배운점
자바에서 String에 +연산을 계속하면 메모리 초과가 날 수 있으니 StringBuilder를 사용하던 다른 방법으로 String을 덧붙여야 한다.
- 이번에는 스택을 직접 구현함으로써 이 문제를 해결했다.
문자를 여러개 출력하는 일이 있으면 java에서는 무조건 StringBuilder를 써서 출력하자!
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17070번 파이프 옮기기1 (0) | 2020.02.08 |
---|---|
[백준] 16637번 괄호 추가하기 (0) | 2020.02.08 |
[백준] 9466번 텀프로젝트 (0) | 2020.02.03 |
[백준] 1074번 Z (0) | 2019.12.17 |
[백준] 2263번 트리의 순회 (1) | 2019.12.16 |