Baekjoon

[백준 17413번](자바) StringBuilder의 중요성

kanado 2024. 9. 30. 14:15

1. 문제


2. 손 코딩

객체지향적으로 문제를 풀기 위해서 총 3개의 함수로 분리하였다.
1. 메인 함수

2. "<,>"를 처리하는 함수

3. 일반 문자열을 처리하는 함수

 


3. 코드

import java.util.Scanner;

public class Main {
    public static class Result {
        int index;
        String modifiedStr;

        public Result(int index, String modifiedStr) {
            this.index = index;
            this.modifiedStr = modifiedStr;
        }
    }
    public static void main (String[] args){
        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();
        String result = "";
        
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == '<'){
                Result result1 = function1(i, str);
                result = result + "<" + result1.modifiedStr + ">";
                i = result1.index;
            } else if (str.charAt(i) == ' '){
                result = result + " ";
            } else {
                Result result2 = function2(i, str);
                result = result + result2.modifiedStr;
                i = result2.index;
            }
        }

        System.out.println(result);  // 결과를 정상 출력
    }

    public static Result function1(int i, String str){
        String str1 = "";
        while (true) {
            i++;
            if (i >= str.length()) {  // 범위 초과 방지
                break;
            }
            if (str.charAt(i) == '>'){
                break;
            }
            str1 = str1 + str.charAt(i);
        }
        return new Result(i, str1);
    }

    public static Result function2(int i, String str) {
        String str1 = "";
        String reversedStr = "";
        while (true) {  
            if (i >= str.length()){ // 범위 초과 방지
                reversedStr = new StringBuilder(str1).reverse().toString();
                str1 = reversedStr;
                break;    
            }
            else if (str.charAt(i) == '<') {
                i--;
                reversedStr = new StringBuilder(str1).reverse().toString();
                str1 = reversedStr;
                break;    
            }
            else if (str.charAt(i)==' ') {
                reversedStr = new StringBuilder(str1).reverse().toString();
                str1 = reversedStr;
                str1 = str1 + " ";
                break;  
            } else {
                str1 = str1 + str.charAt(i);
            }
            i++;
        }
        return new Result(i, str1);
    }
}

 


4. 배운점

내 코드에서는 문자열을 하나씩 처리하면서 결과 문자열을 계속해서 + 연산자로 이어 붙이는데, Java에서 문자열 연결은 성능 면에서 비효율적이다. 문자열을 계속 이어붙일 때마다 새로운 문자열 객체를 생성하기 때문에 많은 메모리를 소모한다.

그래서 찾아본 결과 java에서 문자열을 효율적으로 다룰 수 있는 StringBuilder 도구가 있는 것을 알게 됐다.


5. StringBuilder란?

StringBuilder는 Java에서 문자열을 다룰 때 효율적인 방법을 제공하는 클래스이다. 기본적으로 Java의 String 클래스는 불변(immutable)이기 때문에, 한 번 생성된 문자열은 수정할 수 없다. 즉, String 객체를 수정할 때마다 새로운 객체가 만들어지게 된다. 이 과정은 메모리를 많이 사용하게 되고, 문자열을 자주 변경할 때 성능 저하를 유발할 수 있다.

이 문제를 해결하기 위해 Java에서는 가변(mutable) 문자열 객체인 StringBuilder를 제공한다. StringBuilder는 한 번 생성된 객체 내에서 문자열을 자유롭게 수정할 수 있어 메모리와 성능 측면에서 매우 효율적이다.

 


6. 결론

이번 경우에는 문제 없이 해결할 수 있었지만 앞으로 Java에서 문자열을 자주 변경하거나 처리할 일이 많다면 StringBuilder를 사용할 것!