/ BOJ

BOJ_17473_단어뒤집기2_JAVA

문제 : 단어 뒤집기 2

링크 : BOJ_17473_단어뒤집기2

접근 방식

스택을 이용하면 문자열은 쉽게 뒤집을 수 있다. 괄호 안에 있는 문자열은 뒤집으면 안되는 것을 주의하자. 공백을 기준으로 뒤집기 때문에 공백이 나올 때까지 스택에 쌓다가, 공백을 만나면 스택에서 모두 POP 하는 방식으로 구현해보자.

풀이 방법

  1. 문자열을 읽어와 toCharArray 메서드를 이용해 char 배열로 저장한다.

  2. 배열의 길이만큼 반복한다. For문 안에서 가장 먼저 확인해야 하는 것은 ‘<’, 꺽쇠 여부이다. 현재 탐색하는 문자가 여는 꺽쇠를 만날 경우, 이전까지 push되어있던 스택을 모두 비워 StringBuilder에 추가한다. 추가로 check boolean 값을 false로 바꾼다.(단어 뒤집지 않는 flag 역할)

  3. 두 번째로 스택에 쌓는 조건문이다. check가 true라면 현재 문자를 stack에 push한다. check가 false라면 스택에 push하지 않고 바로 StringBuilder에 append한다.

  4. 닫는 꺽쇠 ‘>’ 를 만나는 조건문은 그 다음이다. 만약 닫는 꺽회를 만나면 check를 true로 바꿔준다.

  5. 다음은 공백문자를 만났을 때의 조건문이다. 공백문자를 만났을 때, check가 true라면, 스택을 모두 비워 StringBuilder에 append 한다.

  6. 마지막으로 현재 문자가 문자열의 끝일 때의 조건문이다. 스택에 남아있는 데이터들을 모두 pop 하여 StringBuilder에 추가한다.

  7. 모든 반복이 종료된 후 완성된 StringBuilder를 출력한다.

소스 코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class BOJ_17413_단어뒤집기 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		char[] chars = in.readLine().toCharArray();

		StringBuilder sb = new StringBuilder();

		Stack<Character> stack = new Stack<>();

		boolean check = true;

		for (int i = 0; i < chars.length; i++) {

			if (chars[i] == '<') {
				while (!stack.isEmpty()) {
					sb.append(stack.pop());
				}
				check = false;
			}

			if (!check) {
				sb.append(chars[i]);
			} else {
				stack.push(chars[i]);
			}


			if (chars[i] == '>') {
				check = true;
			}

			if (chars[i] == ' ' && check) {
				stack.pop();
				while (!stack.isEmpty()) {
					sb.append(stack.pop());
				}
				sb.append(' ');

			} else if (i == chars.length - 1 && check) {
				while (!stack.isEmpty()) {
					sb.append(stack.pop());
				}
			}

		}

		System.out.println(sb);
	}

}