728x90
문제 17413
[ 문제 풀이 ]
'<>' 안에 있는 문자열은 그대로 두고, '<>' 밖에 있는 문자열들만 뒤집어서 출력해야 하는 문제입니다. 일단 문자열을 뒤집어서 출력하기 위해서는 FILO(First In Last Out) 성격인 Stack<>을 이용해야 합니다. 그러면 '<>' 은 어떻게 해야 할까요?
일단 '<>' 는 쌍을 이루기 때문에 '>' 만 신경 써주면 됩니다. 문자열을 순회하면서 '>' 문자를 만났을 때, flag를 false로 바꾸어, 현재 '<' 문자가 없음을 표시해준 후, '>' 문자를 출력하면 됩니다.
여기서 flag는 '<' 를 이전에 만난 적 있는지 표시해주는 변수입니다. flag를 두면 현재의 문자가 '<>' 안에 있는지 확인할 수 있습니다.
1. flag = true 인 경우, 현재 문자가 '>' 이 나올 때까지는 '<>' 안에 있는 문자임.
2. flag = false 인 경우, 현재 문자는 '<>' 밖에 있는 문자임.
공백 기준으로 문자열을 뒤집기 때문에 문자가 빈칸인 경우에는 스택에 있는 문자들을 모두 pop()하여 출력합니다. 그 이외의 문자인 경우, 현재 flag 상태에 따라 '<>' 안에 있는 문자이면 그대로 출력하고, 밖에 있는 문자이면 Stack<>에 넣어줍니다.
모든 문자들을 순회한 후, Stack<>에 남아있는 문자들을 최종적으로 모두 pop() 해줍니다. 중복되는 코드를 방지하기 위해 Stack<>에 있는 문자들을 모두 pop() 하는 pullOut() 함수를 만들어 구현하였습니다.
[ 코드 ]
import java.io.*;
import java.util.Stack;
public class Main {
private static Stack<Character> stack = new Stack<>();
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int str_len = str.length();
boolean flag = false; // '<' 만났는지
for (int i = 0; i < str_len; i++) {
char c = str.charAt(i);
if (c == '>') {
flag = false; // 원래대로
bw.write(">");
} else if (c == '<') {
flag = true;
if (!stack.isEmpty()) pullOut();
bw.write("<");
} else if (c == ' ') { // 공백 기준으로 뒤집음
pullOut();
bw.write(" ");
} else {
if (flag) { // <> 안에 있는 문자열
bw.write(String.valueOf(c));
} else {
stack.push(c);
}
}
}
if (!stack.isEmpty()) pullOut();
bw.flush();
}
private static void pullOut() throws IOException{
while (!stack.isEmpty()) {
bw.write(stack.pop());
}
}
}
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon] 백준 11536번: 줄 세우기 (JAVA) (0) | 2023.11.12 |
---|---|
[Baekjoon] 백준 2992번: 크면서 작은 수 (JAVA) (0) | 2023.11.10 |
[Baekjoon] 백준 5052번: 전화번호 목록 (JAVA) (1) | 2023.11.06 |
[Baekjoon] 백준 11656번: 접미사 배열 (JAVA) (0) | 2023.11.05 |
[Baekjoon] 백준 9935번: 문자열 폭발 (Java) (1) | 2023.11.03 |