// 이전 단어뒤집기 문제의 경우, 공백을 기준으로 단어를 나누었다.
// 이번 문제의 경우 꺽새 내부는 동일하게 처리하되, 꺽새가 아닌 경우 단어를 뒤집어주어야한다.
import java.io.*;
import java.util.*;
class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 문자열 S입력
String str = br.readLine();
// 결과 값을 출력할 StringBuilder
StringBuilder sb = new StringBuilder();
// 열린 꺽새와 닫힌 꺽새를 판별하기 위한 flag
boolean flag = false;
// 후입선출 기능을 이용하기 위한 자료구조 Stack
Stack < Character > stack = new Stack < > ();
// 문자열 S의 길이만큼 반복문 수행
for (int i = 0; i < str.length(); i++) {
// 열린 꺽새를 만났을 경우, stack이 비어있지 않다면 모든 원소를 꺼내고 flag를 true
if (str.charAt(i) == '<') {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
flag = true;
}
// 닫힌 꺽새를 만났을 경우, flag를 false로 입력 후 '>'저장
else if (str.charAt(i) == '>') {
flag = false;
sb.append(str.charAt(i));
continue;
}
// flag가 true일 경우, '>'를 만나기 전까지 그대로 입력
if (flag == true) {
sb.append(str.charAt(i));
}
// flag가 false일 경우, 괄호 이외의 문자를 처리
else if (flag == false) {
// 해당 인덱스의 i번째 문자가 공백일 경우, 모든 원소를 POP수행 후 공백 추가
if (str.charAt(i) == ' ') {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(' ');
continue;
} else {
// 그외의 경우, Stack에 문자 추가
stack.push(str.charAt(i));
}
}
// 반복문이 마지막 횟수일 때, 스택이 비어있지 않다면 원소 추가
if (i == str.length() - 1) {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
}
}
// 결과문 출력
System.out.println(sb);
}
}
해결방법
이전 단어뒤집기 문제의 경우, 공백을 기준으로 단어를 나누어 반복문의 조건식을 이용하여 출력하였다.
하지만 이번 단어뒤집기2의 경우, 꺽새의 내부 문자열은 그대로 유지하고 꺽새의 외부 문자열을 뒤집어야했다.
먼저 열린 꺽새와 닫힌 꺽새를 만났다는 것을 판별하기 위해 flag
변수를 설정하였다. 이 변수는 '<'기호를 만났을 때 true
의 값이 되고, '>'기호를 만났을 때 false
값으로 설정된다.
내가 여기서 문제를 해결할 때 사용한 자료구조는 스택으로써, 후입선출(LIFO)의 특징을 갖고있다. 따라서 [A, B, C]
순으로 스택에 들어갔다면 [C, B, A]
순으로 스택에서 나올 것이다.
가장 먼저 입력받은 문자열 S의 길이만큼 반복문을 수행한다.
만약, 해당 문자가 '<'일 경우, 스택이 비어있지 않다면 모든 원소를 꺼내고 flag
를 true
값으로 설정한다. 해당 문자가 '>'일 경우 flag
를 false
값으로 설정하고, 닫힌 기호를 StringBuilder
에 추가한다.
flag
가 true
일 경우, 해당 문자를 StringBuilder
에 그대로 추가해주고, flag
가 false
일 경우, 인덱스의 위치에 해당하는 문자가 공백일 경우 스택에 있는 모든 원소를 StringBuilder
에 추가하고, 공백 문자도 추가한다.
그 외의 경우, 스택에 인덱스 위치에 해당하는 문자를 넣는다.
반복문이 마지막 횟수일 때, 스택이 비어있지 않는다면 StringBuilder
에 원소를 추가한다.