자바생
article thumbnail
Published 2021. 11. 29. 14:54
자바(백준) 9935 문자열 폭발 BOJ(Java)
728x90

오답 노트 & 새로 알게 된 점

문제를 풀 때, 시간 제한으로 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

 

Vector (Java SE 11 & JDK 11 )

Increases the capacity of this vector, if necessary, to ensure that it can hold at least the number of components specified by the minimum capacity argument. If the current capacity of this vector is less than minCapacity, then its capacity is increased by

docs.oracle.com

 

728x90

'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
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그