Baekjoon
[백준] 17413번 단어 뒤집기2 (Java)
Chaewon Park
2024. 3. 8. 17:26
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
문제

알고리즘
드디어 내 손으로 한 번에 문제를 푼 영광을 맛봤다 .. 아싸 ..
이문제는 Stack을 사용해서 사용하는 문제이다!
1. 한 줄을 입력받는다.
2. 현재 tag 내인지 확인하는 Flag를 만든다.
3. 문자의 한 문자씩 검사한다.(charAt(int index) 사용)
- 공백이면서 tag 내가 아니라면, stack에 있는 문자들을 pop해서 write하고 공백도 write한다.
- '<'라면, Flag를 true로 하고 stack에 있는 문자들을 pop해서 write하고 '<'도 write한다.
- '>'라면, Flag를 false로 하고 '>'를 write한다.
- tag 내의 문자라면, 바로 write한다.
- tag 내가 아닌 일반 문자라면, stack에 push한다.
4. 모든 검사가 끝나고 stack에 아무 문자도 남아있지 않을 때까지 pop해서 write한다.
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> stack = new Stack<>();
String str = br.readLine();
boolean isTag = false;
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
// 공백이면서 tag내의 공백이 아니라면
if(c == ' ' && !isTag) {
// stack에 문자가 있다면 pop
while(!stack.isEmpty()) {
bw.write(stack.pop());
}
bw.write(" ");
}
// '<'라면
else if(c == '<' && !isTag) {
isTag = true;
while(!stack.isEmpty()) {
bw.write(stack.pop());
}
bw.write(c);
}
// tag의 마지막이라면
else if(c == '>' && isTag) {
isTag = false;
bw.write(c);
}
// tag 내의 문자라면
else if(isTag) {
bw.write(c);
}
// 일반 문자라면
else {
stack.push(c);
}
} // end of for...
while(!stack.isEmpty()) {
bw.write(stack.pop());
}
bw.flush();
bw.close();
br.close();
}
}