문자열 폭발 (백준, Java)

이 글의 목차9개
  1. ❌ 틀린 풀이 코드
  2. ✅ StringBuilder를 이용해야 한다.
  3. ✅ String (불변, Immutable)
  4. ✅ StringBuilder (가변, Mutable)
  5. 📌 StringBuilder 기본 문법 정리
  6. 💻 정답 코드
  7. 🛠 추가로 기억할 것
  8. substring(0, str.length())
  9. sb.delete(0, str.length()) /

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

❌ 틀린 풀이 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //StringTokenizer st = new StringTokenizer(br.readLine());
        String input = br.readLine();
        String target = br.readLine();
        input = input.replace(target, "");
        while(input.length() != input.replace(target,"").length()){
            input = input.replace(target, "");
        }
        if(input.length() == 0) System.out.println("FRULA");
        else System.out.println(input);
    }
}

난이도에 비해서 문제가 너무 쉽다고 생각했으나, 메모리 초과가 발생했다.

이유는 replace 매서드가 호출될 때마다 새로운 메모리를 생성하기 때문.

✅ StringBuilder를 이용해야 한다.

✅ String (불변, Immutable)

String은 한 번 생성되면 수정 불가

  • 연산이나 replace()를 할 때마다 새로운 객체가 생성됨 (메모리 낭비)

✅ StringBuilder (가변, Mutable)

동일 객체 내에서 수정 가능 → 메모리 낭비 없음

스택을 사용하여 한글자가 들어올 때마다 마지막 인덱스를 검사(타겟 단어의 길이만큼)하여 확인하는 아이디어

📌 StringBuilder 기본 문법 정리

💻 정답 코드

import java.io.*;
        import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //StringTokenizer st = new StringTokenizer(br.readLine());
        String input = br.readLine();
        String target = br.readLine();
        StringBuilder sb = new StringBuilder();

        for(int i=0;i<input.length();i++){
            sb.append(input.charAt(i));
            if(sb.length()>=target.length()){
                if(sb.substring(sb.length()-target.length(), sb.length()).equals(target)){
                    sb.delete(sb.length()-target.length(), sb.length());
                }
            }
        }
        if(sb.length()==0)System.out.println("FRULA");
        else System.out.println(sb);


    }
}

🛠 추가로 기억할 것

substring(0, str.length())

String기본형과 StringBuilder에서 모두 사용 가능

이 때, end-1 인덱스 까지만 잘리므로 주의

sb.delete(0, str.length()) /

문자열을 삭제한다.

substring과 같이 end-1 인덱스까지만 삭제된다.

전체 글 보기