[java] 백준 17413번 단어 뒤집기

코딩테스트

목록 보기
7/9

문제

입출력

풀이 과정

  • 1) 스택과 큐를 함께 사용했다.

  • 2) 태그 뒤집으면 안되기 때문에 큐에 넣어서 >가 나올때까지 poll()해줬다.

  • 3) 태그가 아니면 공백이 아닐 때만 스택에 집어 넣었고 " "를 만나면 스택이 빌 때까지 pop()해줬다.

공백도 같이 집어 넣으면 스택에서 꺼낼 때 공백이 먼저 나오는 문제가 발생한다 (ex: "push ddd" -> "(공백)hush ddd")

  • 4) 스택에서 pop해준다음 " "를 한번 더 push해주고 pop해줬다.

  • 5) '<'를 만나면 스택이 비어있지 않다면 스택을 먼저 모두 pop해준 다음 큐에 데이터를 집어 넣고 꺼냈다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
//스택과 큐를 함께 사용함
//17413번 단어 뒤집기2
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        String s = br.readLine();

        char[] sarr = s.toCharArray();


        Stack<String> stack1 = new Stack<>();
        Queue<String> queue = new LinkedList<>();


        for(int i = 0; i < sarr.length; i++){
            if(!String.valueOf(sarr[i]).equals(" ")){
                //공백이 아닐때만 push해라
                if(String.valueOf(sarr[i]).equals("<")){
                    //스택에 값이 있으면 먼저 pop해라
                    if(!stack1.isEmpty()){
                        while(!stack1.isEmpty()){
                            sb.append(stack1.pop());
                        }

                    }
                    //'<'를 만나면,,,>를 만날때까지 queue에 넣기
                    while(sarr[i] != '>'){
                        queue.offer(String.valueOf(sarr[i]));
                        i++;
                    }
                    queue.offer(String.valueOf(sarr[i]));
                    while(!queue.isEmpty()){
                        sb.append(queue.poll());
                    }
                }else{
                    stack1.push(String.valueOf(sarr[i]));
                }

            }
            if(String.valueOf(sarr[i]).equals(" ")){
                while(!stack1.isEmpty()){
                    sb.append(stack1.pop());
                }
                stack1.push(" ");
                sb.append(stack1.pop());
            }else if(i == sarr.length -1){
                while(!stack1.isEmpty()){
                    sb.append(stack1.pop());
                }
            }

        }

        System.out.println(sb);


    }
}

기타

조건들이 많아서 복잡하긴했지만
콘솔에 계속 찍어보고, 디버깅해서 풀이 완료!

나는 스택과 큐를 모두 사용했지만 다 풀고 나서 다른 사람들이 어떻게 풀었나 봤는데
s.charAt(i)를 활용해서 태그는 그냥 바로 sb.append()해준 것 같았다.

문자열 처리에 관한 라이브러리들에 대해 공부를 해야겠다는 생각을 하게되었다.

0개의 댓글