백준 17413번, 단어 뒤집기2

95qwer·2022년 5월 14일
0

  1. <> 처리
  2. 공백으로 문자 간 구분
  3. <> 내부 문자가 아니라면 모두 뒤집는다.

<를 만나면,
이전까지 stack에 집어넣었던 모든 문자를 배출합니다.(트리거 역할) 그리고 마킹(boolean 활용)을 하고 다음 문자부터는 모두 그대로 집어넣습니다.

>를 만나면,
앞에서 마킹했던 boolean을 false로 바꾸고 다시 문자 받을 준비를 합니다.

문자열 뒤집기는 stack을 활용하여 쉽게 해결하였고, ' '를 통해 문자 간 구분을 하므로 stack pop의 트리거 역할은 ' '가 하도록 하였습니다.

예를 들어, RJHRJH JHRJHRJHR 문자열이 입력으로 들어 왔다면 RHJRHJ를 스택에 넣고 ' '를 만나는 순간 stack의 모든 원소를 뱉도록 하였습니다.
물론 tag 안에 ' '가 있을 경우에는 stack 연산을 실행하면 안 됩니다.

JHRJHRJHR 또한 출력되어야 하는데, 이 경우 ' ' 없기 때문에
모든 처리 코드가 끝난 후, 마지막에 스택의 내용물을 전부 꺼내는 작업을 실시합니다

	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
		char[] input = bfr.readLine().toCharArray();
		Stack<Character> stack = new Stack<>();
		StringBuilder result = new StringBuilder();
		boolean tagOpen = false;

		for (char c : input) {
			if (c == '<') {
				while (!stack.isEmpty())
					result.append(stack.pop());
				tagOpen = true;
				result.append(c);
			} else if (tagOpen && c == '>') {
				result.append(c);
				tagOpen = false;
			} else if (!tagOpen && c == ' ') {
				while (!stack.isEmpty())
					result.append(stack.pop());
				result.append(c);
			} else {
				if (tagOpen)
					result.append(c);
				else
					stack.add(c);
			}
		}
		while (!stack.isEmpty())
			result.append(stack.pop());
		bfw.write(result.toString());
		bfw.flush();
		bfw.close();
		bfr.close();
	}
profile
한땀한땀오타없이

0개의 댓글