오답 노트 & 새로 알게 된 점
문제를 풀 때, 시간 제한으로 Stack을 사용해야겠다라는 생각까지 들었다.
그러나 구현 부분에서 막혀 풀지 못했다.
처음엔 stack의 개수가 (bomb길이 - 1) 일 때
길이 만큼 pop + 이제 넣을 문자 와 bomb을 비교하였다.
그러나 위와 같이 풀게 된다면 stack Size가 bomb의 길이보다 커지게 될 때 비교할 수 없게 된다.
또한, Stack의 참조형을 String으로 하게 되면 메모리 초과가 난다.
그래서 Character로 바꾸었더니 AC를 받았다.
아마 문제의 메모리 제한이 타이트해서 String을 하게 되면 틀리는 것 같다.
stack은 index의 접근이 안되는 줄 알았다.
그러나 get이라는 메서드가 있었고 index를 통해 stack에 접근할 수 있다!
어떻게 get을 사용할 수 있을까?
java에서 Stack 클래스는 Vector클래스를 상속한다.
여기서 Vector클래스에는 get이라는 메서드가 존재하게 된다.
풀이
stack Size가 bomb의 길이보다 크거나 같아질 때 비교를 한다.
이 때 중요한 점은
stack.get(stack.size() - bomb.length() + j) != bomb.charAt(j)
부분이다.
stack.size() - bomb.length() + j 가 왜 있을까?
예제 2를 봤을 때,
stack에 1 1 2 a 가 있게 된다.
그러면 112a와 bomb을 비교한다. 같지 않으므로 다음 문자를 stack에 넣는다.
1 1 2 a b가 stack에 있다.
1 1 2 a는 우리가 비교했으므로 비교할 필요 없다.
그렇다면 1 2 a b를 비교해야하는데 index 접근을 어떻게 해야할까?
바로
stack.size() - bomb.length() + j
이다.
그래서 문자를 하나하나 비교하여 같으면 길이만큼 pop을 하고,
같지 않으면 다음 문자를 넣으면 된다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.io.*;
import java.util.*;
public class Main {
static int atoi(String str) {
return Integer.parseInt(str);
}
static String s = "";
static String bomb = "";
public static void main(String[] args) throws IOException {
input();
pro();
}
static void pro() {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
stack.push(s.charAt(i));
if (stack.size() >= bomb.length()) {
boolean flag = true;
for (int j = 0; j < bomb.length(); j++) {
if(stack.get(stack.size() - bomb.length() + j) !=
bomb.charAt(j)){
flag = false;
break;
}
}
if(flag){
for (int j = 0; j < bomb.length(); j++) {
stack.pop();
}
}
}
}
StringBuilder sb = new StringBuilder();
if(stack.isEmpty()) System.out.println("FRULA");
else{
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
System.out.println(sb.reverse());
}
}
static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s = br.readLine();
bomb = br.readLine();
}
}
|
cs |
Reference
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Vector.html
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 16973 직사각형 탈출 (0) | 2021.12.07 |
---|---|
자바(백준) 17136 색종이 붙이기 (0) | 2021.11.30 |
자바(백준) 1726 로봇 (0) | 2021.11.29 |
자바(백준) 1941 소문난 칠공주 (0) | 2021.11.27 |
자바(백준) 3190 뱀 (0) | 2021.11.24 |