백준 > 단어 뒤집기 2

jinvicky·2023년 12월 6일
0

ALG

목록 보기
10/62

단어 뒤집기 2

  1. 띄어쓰기를 기준으로 단어 내부 순서만 뒤집기
  2. 태그로 감싸져 있는 경우 태그의 순서는 그대로 두고 <>안의 단어만 내부 순서 뒤집기(띄어쓰기 내부 적용 마찬가지)

처음에 if문이 3중 이상으로 복잡해 지길래 ' '를 처리하는 경우와 <>를 추가하는 경우로 나누어서 먼저 작업하고 합쳤다.

' '를 처리하는 경우

package src.baekjoon;

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

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 line = br.readLine();

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

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

            if(line.charAt(i) != ' ') {
                stack.push(line.charAt(i));
            } else {
                while(stack.size() > 0) {
                    bw.append(stack.pop());
                }
                bw.append(line.charAt(i)); // 마지막에 ' '
            }
        }
        if(!stack.isEmpty()) {
            while(stack.size() > 0) {
                bw.append(stack.pop());
            }
        }

        bw.flush();
        bw.close();
    }
}

최종


package src.baekjoon;

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

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 line = br.readLine();

        Stack<Character> stack = new Stack<>();
        Queue<Character> queue = new LinkedList<>();

        boolean flag = false;
        for (int i = 0; i < line.length(); i++) {
            char ch = line.charAt(i);

            if (ch == '<') { //태그 열기 시작한 경우
                flag = true; //<시작
                if (!stack.isEmpty()) { //닫는 <태그
                    while (stack.size() > 0) {
                        bw.append(stack.pop());
                    }
                }
                bw.append(ch);

            } else if (ch == '>') {
                flag = false;
                if (!queue.isEmpty()) {
                    while (queue.size() > 0) {
                        bw.append(queue.poll());
                    }
                }
                bw.append(ch);
            } else {
                if (flag) queue.add(ch);
                else { //simple text
                    if (ch == ' ') {
                        while(stack.size() > 0) {
                            bw.append(stack.pop());
                        }
                        bw.append(ch);
                    } else {
                        stack.push(line.charAt(i));
                    }
                }
            }
        }

        if(!stack.isEmpty()) {
            while(stack.size() > 0) {
                bw.append(stack.pop());
            }
        }

        bw.flush();
        bw.close();
    }
}

요약

<>태그의 경우 순서를 유지해야 하므로 queue에 추가하고 그냥 문자의 경우 띄어쓰기를 기준으로 stack에 추가한다.
'<'의 경우 stack을 경우에 따라 비우고, '>'의 경우 queue를 경우에 따라 비워서 bw에 추가한다.

후기

띄어쓰기를 할 때마다 스택을 비워주면 되는데 무조건 모든 뒤집기 후에 스택을 비운다고 생각했던 점이 2일 더 잡아먹었다.

소요 시간

4일

profile
일단 쓰고 본다

0개의 댓글