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();
}
}
'Baekjoon' 카테고리의 다른 글
[백준] 1406번 에디터 (Java) (0) | 2024.03.07 |
---|---|
[백준] 1158번 요세푸스 문제 (Java) (0) | 2024.03.06 |
[백준] 2164번 카드2 (Java) (1) | 2024.02.28 |
[백준] 1920번 수 찾기 (Java) (1) | 2024.02.27 |
[백준] 9012번 괄호 (Java) (3) | 2024.02.27 |