코테/백준

[백준/JAVA] 9935번: 문자열 폭발

imname1am 2024. 3. 7. 15:09
반응형

📖 문제

 

9935번: 문자열 폭발

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모

www.acmicpc.net

 

 

💡  풀이 방식

• 스택

스택을 만들어 폭발 문자열과 일치하는 문자열이 생겼을 때 바로바로 빼주는 식으로 push와 pop연산을 진행한다.

 

1. 문자열 str의 전체 길이를 탐색하며 스택에 문자를 하나씩 저장(push)한다.

2. 스택에 들어간 문자의 길이가 폭발 문자열의 길이보다 길다면, 폭발 문자열이 있는지 탐색한다. (⚠ 탐색 범위 : stack.size() - bomb.length() ~ stack.size())

  - 폭발 문자열과 일치하지 않는다면 break;

  - 일치하는 문자열이 존재한다면, stack.pop()

 

 

 

💥 유의사항

- 문자열의 최대 길이가 100만이므로 시간 초과, 메모리 초과에 주의하자.. (🚫 O(N^2) )

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = br.readLine();
        String bomb = br.readLine();
        
        Stack<Character> stack = new Stack<>();
           
        for(int i = 0 ; i < str.length() ; i++) {
            stack.push(str.charAt(i));
            
            // 스택 크기와 폭발 문자열과 길이가 같아질 때 탐색 시작
            if(stack.size() >= bomb.length()) {
                boolean isSame = true; // 폭발 문자열이 있는지 확인용 변수
                
                for(int j = 0 ; j < bomb.length() ; j++) {
                    char ch1 = stack.get(stack.size() - bomb.length() + j); // 폭발 문자열의 길이만큼 꺼내 저장
                    char ch2 = bomb.charAt(j);
                    
                    if(ch1 != ch2) {
                        isSame = false;
                        break;
                    }
                }
                
                if(isSame) { // 일치하는 문자열이 존재하는 경우, 폭발 문자열 삭제
                    for(int j = 0 ; j < bomb.length() ; j++)
                        stack.pop();
                }
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for(char ch : stack)
            sb.append(ch);
        
        System.out.println(sb.length() == 0 ? "FRULA" : sb.toString());
    }
}
 
cs

 

 

➕ 다른 풀이 방식

- 같은지 확인할 때 boolean 변수 안 쓰고 활용하신 풀이

 

[Java] 백준 9935번 [문자열 폭발] 자바

[Java] 백준 9935번 [문자열 폭발] 자바

velog.io

 

 

- 스택 안 쓰시고, StringBuilder만 활용하시는 풀이...! 심지어 더 빠르다. (sb.delete())

 

[백준] 9935번 문자열 폭발 (자바 풀이)

문제 https://www.acmicpc.net/problem/9935 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보

code-lab1.tistory.com


💦 어려웠던 점

- 처음에 replaceAll로 해서 처리하려다가 문자열의 최대 길이가 100만이므로 메모리 초과가 떴었다.

 

자바의 String은 immutable한 값이라 값을 바꿀 때마다 매번 새 String을 할당해야 하기 때문이라고 한다.(참고1, 참고2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = br.readLine();
        String bombStr = br.readLine();
        
        while(str.contains(bombStr)) {
            str = str.replaceAll(bombStr, "");    // 시간 복잡도 : O(N^2)
        }
        
        System.out.println(str.length() == 0 ? "FRULA" : str);
    }
}
 
cs

 

 

 

🧐 새로 알게 된 내용

스택은 List  인터페이스를 상속받은 구현 클래스로, 스택 객체를 생성해도 ArrayList 메소드를 사용할 수 있다.

그래서 List 인터페이스에서 사용하는 .get 메소드를 사용한 거구나!!

그 외 사용 가능한 메소드들은 아래와 같다.

 

- 스택.get(인덱스) / 스택.elementAt(인덱스) : ArrayList의 .get 메소드는 주어진 idx에 저장된 값을 반환

- 스택.set(인덱스, 값) : 인덱스 위치에 있는 스택 값 변경하기

- 스택.indexOf("값") : 스택 특정 값이 어느 인덱스에 있나 확인

 

 

아 자료구조 좀만 생각해도 저렇게 메소드를 쓸 생각을 할 수 있었는데..  잊고 있었다,,,

이래서 자료구조가 중요한,,,

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 풀이 참고

 

[BOJ] 백준 9935번 문자열 폭발 (Java)

#9935 문자열 폭발 난이도 : 골드 4 유형 : 자료구조 / 문자열 / 스택 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭

loosie.tistory.com

 

[BOJ][Java] 백준 9935번: 문자열 폭발

문제 설명 상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다. 폭발은 다음과 같은 과정으로 진행된다. 문자

jgeun97.tistory.com

 

 

[백준] G4 9935번 문자열 폭발 (JAVA)

문제 출처 - Baekjoon Online Judge 문제는 여기 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길

blackvill.tistory.com

 

 

✔ 스택 관련 참고

(특히 첫 번째 글이 최고,,,)

 

[JAVA] Stack 직접 구현하기

Stack 이란 Stack, 우리는 스택이라는 용어를 쌓여가는 것에 사용한다. 1스택, 2스택 .... . 즉, Stack은 데이터가 쌓여가는 것을 나타내는 자료구조로 생각하면 편한다. Stack을 이야기할 때 항상 따라서

jinyoungchoi95.tistory.com

 

자바 Stack 예제부터 사용방법까지

자바에서 Stack의 주요 특징은 나중에 넣은게 먼저 나온다는 것인데 이것을 LIFO (Last In First Out) 이라고 한다 1,2,3을 차례대로 넣고 꺼낼 시 3,2,1 순으로 나온다는 것 Stack의 주요 메소드는 아래와 같

wakestand.tistory.com

 

[자료 구조] 스택 (Stack)

자바(Java)로 구현한 스택 예제 스택(Stack) 컨셉 스택(Stack)이란 무었인가? 스택은 같은 타입의 자료를 "하나 다음 하나"라는 컨셉으로 순차적으로 저장하는 직선형 자료 구조이다. 우리가 스택에서

muckycode.blogspot.com

 

반응형