백준 17413 - 단어 뒤집기 2

Updated:

Java

17413 번 - 단어 뒤집기 2

문제

접근 방법

Stack을 이용하여 단어를 뒤집어 보았다.
문자열을 앞에서 부터 탐색하여 ‘<’나 ‘ ‘를 만나지 않으면 계속하여 문자를 Stack에 저장하고 개수를 센다.
만약 ‘<’와 ‘ ‘를 만나면, 단어 처음부터 Stack을 pop하여 하나씩 갱신해 단어를 뒤집어 본다.

’<’를 만나면 ‘>’를 만날때 까지 문자를 Stack에 넣지 못하게 하여 태그는 보존한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		char[] str = br.readLine().toCharArray();

		int idx = 0;
		char curC;
		boolean tagOn = false;
		Stack<Character> stack = new Stack<>();
		// 앞에서 부터 탐색
		for(int i = 0; i < str.length; i++) {
			curC = str[i];
			if(curC == ' ' || curC == '<') {
				// 단어를 뒤집는다.
				while(!stack.isEmpty()) {
					str[i - idx] = stack.pop();
					idx--;
				}
				if(curC == '<') {
					tagOn = true;
				}
			}
			else if(curC == '>') {
				tagOn = false;
			}
			else if(!tagOn) {		// 태그 내부가 아니면 stack에 쌓는다
				idx++;
				stack.add(curC);
			}
			// 만약 단어가 이어지다 마지막에 다다르면, 뒤집고 종료한다.
			if(i == str.length - 1) {
				while(!stack.isEmpty()) {
					str[i - idx + 1] = stack.pop();
					idx--;
				}
			}
		}

		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < str.length; i++) {
			sb.append(str[i]);
		}
		System.out.println(sb.toString());
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

Stack과 문자열을 사용한 구현 문제.

개선할 점