BOJ_17473_단어뒤집기2_JAVA
문제 : 단어 뒤집기 2
링크 : BOJ_17473_단어뒤집기2
접근 방식
스택을 이용하면 문자열은 쉽게 뒤집을 수 있다. 괄호 안에 있는 문자열은 뒤집으면 안되는 것을 주의하자. 공백을 기준으로 뒤집기 때문에 공백이 나올 때까지 스택에 쌓다가, 공백을 만나면 스택에서 모두 POP 하는 방식으로 구현해보자.
풀이 방법
-
문자열을 읽어와 toCharArray 메서드를 이용해 char 배열로 저장한다.
-
배열의 길이만큼 반복한다. For문 안에서 가장 먼저 확인해야 하는 것은 ‘<’, 꺽쇠 여부이다. 현재 탐색하는 문자가 여는 꺽쇠를 만날 경우, 이전까지 push되어있던 스택을 모두 비워 StringBuilder에 추가한다. 추가로 check boolean 값을 false로 바꾼다.(단어 뒤집지 않는 flag 역할)
-
두 번째로 스택에 쌓는 조건문이다. check가 true라면 현재 문자를 stack에 push한다. check가 false라면 스택에 push하지 않고 바로 StringBuilder에 append한다.
-
닫는 꺽쇠 ‘>’ 를 만나는 조건문은 그 다음이다. 만약 닫는 꺽회를 만나면 check를 true로 바꿔준다.
-
다음은 공백문자를 만났을 때의 조건문이다. 공백문자를 만났을 때, check가 true라면, 스택을 모두 비워 StringBuilder에 append 한다.
-
마지막으로 현재 문자가 문자열의 끝일 때의 조건문이다. 스택에 남아있는 데이터들을 모두 pop 하여 StringBuilder에 추가한다.
-
모든 반복이 종료된 후 완성된 StringBuilder를 출력한다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class BOJ_17413_단어뒤집기 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
char[] chars = in.readLine().toCharArray();
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
boolean check = true;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '<') {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
check = false;
}
if (!check) {
sb.append(chars[i]);
} else {
stack.push(chars[i]);
}
if (chars[i] == '>') {
check = true;
}
if (chars[i] == ' ' && check) {
stack.pop();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(' ');
} else if (i == chars.length - 1 && check) {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
}
}
System.out.println(sb);
}
}