Algorithm & SQL/BOJ
[백준 17413번 / Java] BOJ 17413 : 단어 뒤집기 2
김룹
2024. 2. 28. 14:20
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder total = new StringBuilder(); // 출력할 문자열
StringBuilder now = new StringBuilder(); // 현재 문자열
boolean flag = false; // <> 안에 들어있는 단어인지 판단하기 위한 변수
char[] arr = br.readLine().toCharArray();
for(int i = 0; i < arr.length; i++) {
if(arr[i] == '<') {
flag = true; // <가 시작되면 true로 변경
total.append(now.reverse()); // '<' 전까지 입력되었던 문자열 뒤집어서 저장
now = new StringBuilder(); // 현재 문자열 초기화
now.append('<'); // 현재 문자열에 '<' 추가
} else if(arr[i] == '>') {
flag = false; // >로 닫히면 false로 변경
now.append(arr[i]); // 현재 문자열에 '>' 추가
total.append(now); // '>'까지 입력된 문자열 그대로 저장
now = new StringBuilder(); // 현재 문자열 초기화
} else if(arr[i] == ' ' || i == arr.length - 1) { // 공백이거나 맨 마지막 문자일 경우
if(flag) { // <> 안에 있는 문자라면 현재 문자열에 그대로 추가
now.append(arr[i]);
} else { // <> 안에 있는 문자가 아니라면
if(i == arr.length - 1) { // 문자열의 맨 마지막 문자일 경우
now.append(arr[i]); // 현재 문자열에 추가
total.append(now.reverse()); // 뒤집어서 저장
} else { // 공백일 경우
total.append(now.reverse()).append(' '); // 뒤집은 다음 공백 저장
}
now = new StringBuilder();
}
} else {
now.append(arr[i]); // 문자라면 현재 문자열에 그대로 저장
}
}
System.out.println(total);
}
}
느낀 점 및 정리✍️
1. 배열의 마지막 인덱스에 있을 경우와 공백의 경우는 디버깅하면서 추가 조건을 붙이게 되었다. 처음에는 그것까진 생각을 못했다
2. 오늘 풀면서 String과 StringBuilder의 차이점이 궁금해졌다. 예를 들면 String answer = ""; answer += now; 로 하는 것과 sb.append(now) 하는 것의 차이가 궁금해져서 찾아보았는데 String은 문자열이 업데이트 될 때마다 계속해서 메모리 블럭 추가되고 일회용으로 사용된 이 메모리들은 Garbage Collector의 제거 대상이 되어 빈번하게 Minor GC를 일으킨다고 한다. 반면 StringBuilder는 자제 메모리 블럭에서 늘이고 줄이고 할 수 있기 때문에 훨씬 더 효율적으로 문자열 데이터를 다룰 수 있다고 한다! 정리하자면, 문자열 연산이 많을 경우 StringBuilder()가 낫다!