[백준17413] 단어 뒤집기 2 / Java

Hyeongmin Jung·2022년 12월 1일
0

java

목록 보기
15/28

링크 | https://www.acmicpc.net/problem/17413

문제 |

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

입력 |

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

출력 |

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

예제 |

입력      baekjoon online judge
출력      noojkeab enilno egduj

입력      <open>tag<close>
출력      <open>gat<close>

입력      <ab cd>ef gh<ij kl>
출력      <ab cd>fe hg<ij kl>

입력      one1 two2 three3 4fourr 5five 6six
출력      1eno 2owt 3eerht rruof4 evif5 xis6

입력      <int><max>2147483647<long long><max>9223372036854775807
출력      <int><max>7463847412<long long><max>7085774586302733229

입력      <problem>17413<is hardest>problem ever<end>
출력      <problem>31471<is hardest>melborp reve<end>

입력      <   space   >space space space<    spa   c e>
출력      <   space   >ecaps ecaps ecaps<    spa   c e>

Solution |

  • tag가 true일때는 stack 역순으로 출력하여 원래 string대로 출력하고, false인 경우 stack 차례대로 출력하여 뒤집혀서 출력될 수 있도록 한다.
  • "<"을 만나면 tag 활성화, ">"을 만나면 tag안의 내용을 출력하고 다시 비활성화
  • " "을 만나면 이제껏 stack에 쌓인 str들을 출력해고 비운다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
	static Stack<String> stack = new Stack<String>();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		boolean tag = false;		
		String str = br.readLine();		
		String[] splitStr = str.split("");

		for(int i=0; i<splitStr.length; i++) {
			if (splitStr[i].equals("<")) {
				printStack(tag);
				tag = true;
				stack.push(splitStr[i]);			
			}else if (splitStr[i].equals(">")){
				stack.push(splitStr[i]);
				printStack(tag);
				tag = false;
			}else {
				if (splitStr[i].equals(" ") && tag==false){
					printStack(tag);
					System.out.print(splitStr[i]);
				}else {
					stack.push(splitStr[i]);
				}
			}
		}
		printStack(tag);
		br.close();
	}
	
	static void printStack(boolean tag) {
		StringBuilder sb = new StringBuilder();
		
		while(!stack.empty()) {
			if(tag) {
				sb.insert(0, stack.peek());
				stack.pop();
			}else {
				sb.append(stack.peek());
				stack.pop();
			}
		}

		System.out.print(sb);
	}
}

0개의 댓글