Problem Solving/Java

백준 17413 단어 뒤집기2 문제 풀이 Stack 활용 ( Java )

TakeKnowledge 2019. 10. 19. 11:33
반응형
 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다. 문자열의 시작과 끝은 공백이 아니다. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다. 태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자

www.acmicpc.net

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
public class Main {
 
    private static void printStack(BufferedWriter bw, Stack<Character> stack) throws IOException {
        // 스택에 쌓인 단어를 모두 출력하는 함수. 여러번 필요해서 함수로 분리
        while (!stack.isEmpty()) {
            bw.write(stack.pop());
        }
    }
 
    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 s = br.readLine();
        // Line 입력 받고 s 에 저장
 
        boolean tag = false;
        // tag 안인지 밖인지 확인할 flag 생성
 
        Stack<Character> stack = new Stack<Character>();
        // 단어들 뒤집을 Stack 생성
 
        for (int i = 0; i < s.length(); i++) {
        // 단어를 처음부터 끝까지 검사
 
            if (s.charAt(i) == '<') {
                // 태그 시작일 때
                
                tag = true;
                // tag 안인지 확인하는 flag를 true로 바꾸고
                
                printStack(bw,stack);
                // 그동안 stack에 쌓인 단어들을 스택이 빌 때 까지 비워준다
 
                bw.write(s.charAt(i));
                // 태그 출력
                
            } else if (s.charAt(i) == '>') {
                // 태그 종료일 때
                
                tag = false;
                // tag 안인지 확인하는 flag를 false로 바꾸고
 
                bw.write(s.charAt(i));
                // 그 단어 그대로 출력
 
            } else if (tag) {
                // 태그 안일 경우
                bw.write(s.charAt(i));
                // 그 단어 그대로 출력
            } else {
                // 태그 바깥일 경우
                if(s.charAt(i)==' ') {
                    //공백이면
                    printStack(bw,stack);
                    // 그동안 stack에 쌓인 단어들을 스택이 빌 때 까지 비워준다
                    bw.write(s.charAt(i));
                    // 공백 출력
                }else {
                    //공백이 아니면
                    stack.push(s.charAt(i));
                    // stack에 넣어준다 
                }
 
            }
 
        }
        
        // 반복이 끝나고 마지막일 경우
        printStack(bw,stack);
        // 그동안 stack에 쌓인 단어들을 스택이 빌 때 까지 비워준다
        
        // BufferedWriter 비움
        bw.flush();
        // reader, writer 종료
        bw.close();
        br.close();
 
    }
 
}

처음엔 split 해서 stack과 queue를 번갈아 활용하는 방식으로 접근했다가

결국 Stack만 활용해서 해결하는 방식으로 풀었다

반응형