problem-solving

[BOJ] 17413: 단어 뒤집기2

힝뿌 2024. 5. 23. 01:07
반응형

문제


문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

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

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

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

 

 

입력


첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

 

 

출력


첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

 

 

 

풀이

처음에 딱 문제를 보자마자 Stack으로 풀어야겠다는 느낌이 들었다. 쉽게 풀릴 줄 알았지만 은근히 < >의 복병이 있었다.

< > 안의 문자들은 단어가 아니라고 했기 때문에 뒤집어서 출력하면 안 된다.

하지만 Stack 자료구조 상 push를 하게 되면 뒤집어서 나오게 된다.

'그렇다면 insert(0)을 이용해서 풀어볼까?' 라는 생각을 해서 시도했지만 실-패😩

 

하지만 이것은 정말 멍청한 생각이었다는 것을 깨달았다.

넣은 순서대로 출력해 주는 Queue를 이용하면 되는 게 아닌가!!!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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));
        Stack<Character> stack = new Stack<>();
        Queue<Character> queue = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        boolean check = false;
        char[] chars = br.readLine().toCharArray();

        for(int idx=0; idx<chars.length; idx++) {
            if(chars[idx] == '<') {
                while(!stack.isEmpty()) sb.append(stack.pop());

                check = true;
                queue.offer(chars[idx]);
            }
            else if(chars[idx] == '>') {
                check = !check;
                queue.offer(chars[idx]);
                while(!queue.isEmpty()) sb.append(queue.poll());
            }
            else if(check) queue.offer(chars[idx]);
            else if(chars[idx] == ' ') {
                while(!stack.isEmpty()) sb.append(stack.pop());
                sb.append(chars[idx]);
            }
            else if(idx == chars.length-1) {
                stack.push(chars[idx]);
                while(!stack.isEmpty()) sb.append(stack.pop());
            }
            else stack.push(chars[idx]);
        }
        for(int i=0; i<sb.length(); i++) System.out.print(sb.charAt(i));
        br.close();
    }
}

 

if문이 많다 보니 코드가 살짝 지저분한 느낌이 없지 않다.

문제를 맞힌 후, 다른 사람들의 풀이를 찾아보다가 Queue를 사용하지 않고 그냥 Stack으로 사용해서 푼 풀이를 보고 아차 했다.

< >가 나오면 queue에 offer 하지 않고 그냥 StringBuilder에 추가하는 방식으로 풀 수 있던 것이다.

그렇게 푸는 게 더 공간적, 시간적으로 더 효율적인 것 같다.

 

 

 

 

 

문제 링크)

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

반응형

'problem-solving' 카테고리의 다른 글

[BOJ] 1406: 에디터  (0) 2024.05.14
[코테연습] JadenCase 문자열 만들기  (0) 2023.10.31