Programming/JAVA
[백준] 17413: 단어 뒤집기 2
gayeon_
2024. 2. 2. 00:42
입력된 문자열을 뒤집어 출력하는 문제이다.
먼저 들어온 문자가 나중에 출력되는 방식이니 스택을 사용했다.
<>는 태그로 뒤집지 않는다.
입출력 예제다.
입력 첫글자부터 마지막글자까지 뒤집는 것이 아닌
공백으로 단어를 구분하고 단어별로 뒤집어야 한다.
package boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
// StringBuilder를 사용하여 결과를 한 번에 출력하기 위한 객체 생성
StringBuilder sb = new StringBuilder();
// BufferedReader를 사용하여 입력을 받기 위한 객체 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// int N = Integer.parseInt(br.readLine());
// 문자를 저장할 스택 생성
Stack<Character> stack = new Stack<Character>();
// 문자열 입력
String input = br.readLine();
// 태그 판별을 위한 flag
// 태그일 경우 true -> sb에 바로 append
boolean flag = false;
// 입력받은 문자열을 문자 단위로 스택에 넣기 (공백도 입력된다.)
// 태그는 스택에 넣지 않는다.
for(int i = 0; i < input.length(); i++) {
if(input.charAt(i) == '<') {
while(!stack.isEmpty()) {
sb.append(stack.pop());
}
flag = true;
}
else if(input.charAt(i) == '>') {
flag = false;
sb.append(input.charAt(i));
continue;
}
// flag가 true면 입력된 input.charAt(i)는 tag이다.
if (flag == true) {
sb.append(input.charAt(i));
}
else if (flag == false) {
// 공백인 경우, 스택의 모든 원소를 pop해야 한다.
if (input.charAt(i) == ' ') {
while(!stack.isEmpty()) {
sb.append(stack.pop());
}
// 모든 원소를 pop한 후 sb에 공백 추가
sb.append(input.charAt(i));
continue;
} else {
stack.push(input.charAt(i));
}
}
// 반복문이 마지막 횟수일 때, 스택이 비어있지 않다면 원소 추가
if (i == input.length() - 1) {
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
}
}
// 결과 출력
System.out.println(sb);
}
}
태그는 그대로 출력되고, 태그가 아닌 문자는 뒤집혀서 출력되므로
태그가 아닌 문자만 스택에 넣어 공백을 만났을 때 pop()해주면 된다.
태그와 그냥 문자열을 구분하기 위해 boolean 타입인 flag를 사용했다.
입력된 문자가 <인 경우 flag를 true로 설정해 태그임을 표시했다.
flag가 true면 스택에 push하지 않고 sb에 append 된다.
또한 공백을 기준으로 각 단어들의 위치는 그대로이고 단어 내에서 순서가 뒤집히기 때문에
공백을 만났을 때 스택이 비어있지 않다면 모두 pop해 준다.