본문 바로가기

백준 풀이

백준 17413 - 단어뒤집기 2

깃허브:

https://github.com/MSIQOC/BOJ/blob/master/b17413_%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B02.java

 

www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

msiqoc.tistory.com/4

 

백준 9093 - 단어 뒤집기

깃허브: https://github.com/MSIQOC/BOJ/blob/master/b9093_%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0.java https://www.acmicpc.net/problem/9093 9093번: 단어 뒤집기 첫째 줄에 테스트 케이스의 개수 T가..

msiqoc.tistory.com

앞서 설명했던 단어 뒤집기 문제를 풀었다면 쉽게 풀리는 문제였다.

9093번 단어 뒤집기와 다른 점은 태그가 들어가있다는 점이다. 뒤집어서 출력해야 하는건 단어들 뿐인데 태그는 단어가 아니기 때문에 뒤집어서 출력하면 안된다.

 

위와 같은 조건을 만족하기 위해서 간단히 if-else 구문을 사용해주었다. 크게는 두가지 경우로 나누어서 알고리즘을 구현했다.

1. 스택이 비어있고 '<'를 만났을 경우

=> 앞에서 뒤집어야 했을 단어들은 이미 다 뒤집어서 출력한 상태이기 때문에 단어는 신경쓰지 않고 '<'에서 '>'까지 있는 그대로 출력한다.

2. 스택에 글자가 쌓이다가 ' '나 '<'를 만났을 경우

=>뒤집어야 될 단어의 글자들을 스택에 다 저장했다가 꺼내야 될 경우이다. 스택이 다 빌 때까지 스택에서 글자를 꺼낸다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;
import java.io.*;
 
public class b17413_단어뒤집기2 {
    public static void main(String args[]) throws IOException {
        Scanner sc = new Scanner(System.in);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Character> stack = new Stack<>();
        String s = sc.nextLine();
        for (int j = 0; j < s.length(); ++j) {
            if (stack.empty() && s.charAt(j) == '<') { //스택이 비어있고 현재 문자가 '<'인경우
                int k = j;
                while (s.charAt(k) != '>') { //'>'를 만날 때까지 출력 시작
                    bw.write(s.charAt(k));
                    ++k;
                }
                bw.write('>');
                j = k;
            } 
            else if (s.charAt(j) == ' ') {  //스택에 쌓이다가 스페이스를 만나면 스텍에 있는거 다 꺼내고 띄어쓰기를 하게됨.
                while (!stack.empty())
                    bw.write(stack.pop());
                bw.write(' ');
            } 
            else if(s.charAt(j) == '<') { //스택에 쌓이다가 <를 만나게 되면 있는걸 다 토해내고 다시 첫번째 if문에 걸리게 하기 위해서 j값 1만큼 빼줌.
                while (!stack.empty())
                    bw.write(stack.pop());
                --j;    //다시 첫번째 if문에 걸리게 하기 위해서 j 값을 1만큼 빼줌.
            }
            else
                stack.push(s.charAt(j));  //위의 사항에 다 해당이 안되면 뒤집혀져야하는 단어이기 때문에 스택에 너어줌.
        }
        while (!stack.empty())
            bw.write(stack.pop());
        bw.flush();
    }
}
 
 
 

'백준 풀이' 카테고리의 다른 글

백준 1158 - 요세푸스 문제  (0) 2021.01.10
백준 9012 - 괄호  (0) 2021.01.10
백준 10866 - 덱  (0) 2021.01.06
백준 9093 - 단어 뒤집기  (0) 2021.01.04
백준 10845-큐  (0) 2021.01.04