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를 사용할 것!
'Baekjoon' 카테고리의 다른 글
BufferedReader와 StringTokenizer vs Scanner 차이점 (0) | 2024.10.04 |
---|---|
자바에서 Scanner를 사용할 때 개행 문자와 버퍼의 개념 이해 (1) | 2024.09.26 |
백준 2667번 문제 (자바) (0) | 2023.07.23 |
백준 2468번 문제 (자바) (0) | 2023.07.18 |
백준 1748번 문제 [자바] (0) | 2023.07.13 |