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해 준다.