종식당

[백준 9935] 문자열 폭발 본문

백준

[백준 9935] 문자열 폭발

종식당 2024. 11. 1. 17:01
728x90
반응형

 

https://www.acmicpc.net/problem/9935


  • 문제설명
    문자를 한 줄 입력받고 다음줄에 또 문자를 입력받는다. 만약 첫번째 문자열에 두번째 문자열이 포함되어 있으면 해당 문자열을 삭제해주고 삭제 한 부분을 빼고 남은 문자들을 이어준다. 만약 이었을 때 또 다시 포함되어 있다면 위 과정을 계속 진행한다. 포함되어 있지 않을 때 까지 진행하고 만약 모두 지웠는데 문자열의 길이가 0이면 "FRULA"를 출력한다.
  • 제출코드     
import java.util.*;

public class Main {
    public static void main(String[] args){
//        Scanner sc = new Scanner(System.in);
//
//        String str = sc.next();
//        String bomb = sc.next();
//
//        String answer = "";
//        int len = bomb.length();
//
//        while(str.contains(bomb)){
//            int idx = str.indexOf(bomb);
//            str = str.substring(0,idx)+ str.substring(idx+len);
//        }
//        if(str.length() != 0) System.out.println(str);
//        else System.out.println("FRULA");
        Scanner sc = new Scanner(System.in);

        String str = sc.next();
        String bomb = sc.next();

        StringBuilder sb = new StringBuilder();
        int len = bomb.length();

        for (int i = 0; i < str.length(); i++) {
            sb.append(str.charAt(i));  // 문자열을 한 글자씩 StringBuilder에 추가

            // 현재 StringBuilder의 마지막 부분이 bomb와 일치하는지 확인
            if (sb.length() >= len && sb.substring(sb.length() - len).equals(bomb)) {
                sb.delete(sb.length() - len, sb.length());  // 일치하는 부분 제거
            }
        }

        // 남은 문자열이 있으면 출력하고, 없으면 "FRULA" 출력
        if (sb.length() != 0) System.out.println(sb.toString());
        else System.out.println("FRULA");
    }

 

  • 코드설명
    먼저 문자들을 입력받고 두번째 문자의 길이를 구한다. 이는 첫번째 문자열에서 두번째 문자열을 삭제할 때 사용하기 위해서다. for문을 통해 문자들을 StringBuilder에 넣어주고 넣으면서 마지막 문자가 bomb와 같은 지 확인한다.
    만약 같다면, 마지막 일치하는 부분을 delete를 사용해 삭제해준다.

  • 마무리
    처음에는 위 주석처럼 문제를 풀었는데 메모리 초과가 났었다. 메모리 초과가 왜 나는지 궁금했는데 str문자열에서 bomb문자를 찾을 때마다 메모리에 새로운 문자열 객체가 계속 생성되기 때문이다. 객체가 계속 생성되어 메모리에 쌓이다 보니 메모리 사용량이 증가해서 답은 맞아도 통과를 받을 수 없었다.
    이를 해결하는 방법이 바로 StringBuilder이다. 
    StringBuilder는 String과는 달리 가변적이므로 문자열을 동적으로 수정하는 데 좋다.
    문자열 관련 문제들 좀 많이 풀어 보면서 StringBuilder에 익숙해져야겠다.
728x90
반응형

'백준' 카테고리의 다른 글

[백준 1932] 정수 삼각형  (0) 2024.12.18
[백준 9095] 1, 2, 3 더하기  (2) 2024.12.16
[백준 3050] 나머지  (0) 2024.09.28
[백준 7562] 나이트의 이동  (0) 2024.08.20
[백준 1747] 소수&팰린드롬  (0) 2024.08.16