https://www.acmicpc.net/problem/9935
처음엔 디큐(남들은 데크라고 함) 두 개를 써서 풀려고 했다. 두 디큐를 왔다갔다 하면서 뒤에서 빼줬다. 어차피 문자열 100만자 해봤자 200만 바이트 즉 2메가인데 메모리는 생각 자체를 안했다. 그리고 메모리가 터졌다. 내 속도 터졌다.
일주일이 지났다. 기부니가 안조아서 종일 누워있다가 스트레스 하나라도 해소할 겸 문제를 열었다. 디큐는 가변 메모리구조나 하나를 쓰든 두개를 쓰든 똑같겠지만 디큐를 하나만 써봤다. 메모리 초과가 났다. ArrayList 디큐가 LinkedList보다
메모리를 적게 쓴대서(속도는 더 느린걸로 암) 바꿨다. 시간초과가 났다.(2차위기)
코드를 다 지우고 문제의 비밀을 파헤쳤다. 이 문제의 비밀은 입력을 앞에서부터 읽으면서 바로바로 처리해도 결과가 같다는 것이였다. 자료구조 버리고 문자열로 갔다. Bufferedwriter도 사용했다. 숏코딩으로 깔끔하게 풀렸다. 기분굿.
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringBuilder input, answer;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
input = new StringBuilder(br.readLine());
answer = new StringBuilder();
String bomb = br.readLine();
for (int i = 0; i < input.length(); i++) {
answer.append(input.charAt(i));
if (input.charAt(i) == bomb.charAt(bomb.length() - 1) && answer.length() >= bomb.length())
if (answer.substring(answer.length() - bomb.length()).equals(bomb))
answer.delete(answer.length() - bomb.length(), answer.length());
}
bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(answer.length() == 0 ? "FRULA" : answer.toString());
bw.flush();
}
}
'Algorithm > 문제' 카테고리의 다른 글
[백준 / JAVA] 2638. 치즈(G3) (0) | 2024.10.26 |
---|---|
[백준 / JAVA] 1987. 알파벳 (G4) (0) | 2024.10.22 |
[백준 / JAVA] 19238. 스타트 택시 (G2) (5) | 2024.10.09 |
[백준 / JAVA] 17141. 연구소 2 (G4) (0) | 2024.10.05 |
[백준 / JAVA] 17142. 연구소 3 (G3) (0) | 2024.10.05 |