[JAVA] 백준 (실버3) 17413번 단어 뒤집기 2

AIR·2023년 9월 21일
0

링크

https://www.acmicpc.net/problem/17413


문제 설명

(정답률 56.872%)
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

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

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

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


입력 예제

baekjoon online judge


출력 예제

noojkeab enilno egduj


나의 코드

  1. <을 만나면 >을 만날때까지 그대로 출력, 이전에 단어가 있었을 경우 반대로 출력
  2. 태그가 아닐때 공백을 만나면 공백을 구분하여 반대로 출력
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String str = br.readLine();
        List<Character> result = new ArrayList<>();
        Stack<Character> stack = new Stack<>();
        boolean isTag = false;	//태그인지 판단하는 불리언 변수

		//입력받은 문자열 문자 하나씩 체크한다
        for (char c : str.toCharArray()) {
			//'<'를 만나면 태그로 판단
            //스택에 데이터가 있을 경우 모두 꺼낸다
            if (c == '<') {
                isTag = true;
                while (!stack.isEmpty()) {
                    result.add(stack.pop());
                }
            //'>'를 만나면 태그가 아닌걸로 판단
            } else if (c == '>') {
                isTag = false;
                result.add(c);
                continue;
            //공백을 만났을때 태그가 아닌 경우
            //스택에 데이터가 있을 경우 모두 꺼낸다
            } else if (c == ' ' && !isTag) {
                while (!stack.isEmpty()) {
                    result.add(stack.pop());
                }
            }
			//태그이거나 단어를 구분하는 공백일 경우
            //그래도 리스트에 추가한다
            if (isTag || c == ' ') {
                result.add(c);
            //태그가 아닐 경우 스택에 넣는다.
            } else if (!isTag) {
                stack.add(c);
            }

        }
        //스택에 데이터가 남아 있을 경우 모두 꺼낸다
        while (!stack.isEmpty()) {
            result.add(stack.pop());
        }
        for (char c : result) {
            bw.write(c);
        }

        bw.close();
    }
}
profile
백엔드

0개의 댓글