본문 바로가기
Baekjoon

[백준] 17413번 단어 뒤집기2 (Java)

by Chaewon Park 2024. 3. 8.

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net


문제


알고리즘

 

드디어 내 손으로 한 번에 문제를 푼 영광을 맛봤다 .. 아싸 .. 

 

이문제는 Stack을 사용해서 사용하는 문제이다!

 

1. 한 줄을 입력받는다.

2. 현재 tag 내인지 확인하는 Flag를 만든다.

3. 문자의 한 문자씩 검사한다.(charAt(int index) 사용)

  • 공백이면서 tag 내가 아니라면, stack에 있는 문자들을 pop해서 write하고 공백도 write한다.
  • '<'라면, Flag를 true로 하고 stack에 있는 문자들을 pop해서 write하고 '<'도 write한다.
  • '>'라면, Flag를 false로 하고 '>'를 write한다.
  • tag 내의 문자라면, 바로 write한다.
  • tag 내가 아닌 일반 문자라면, stack에 push한다.

4. 모든 검사가 끝나고 stack에 아무 문자도 남아있지 않을 때까지 pop해서 write한다.


코드
import java.util.*;
import java.io.*;

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));
        Stack<Character> stack = new Stack<>();

        String str = br.readLine();
        boolean isTag = false;

        for(int i=0; i<str.length(); i++) {
            char c = str.charAt(i);

            // 공백이면서 tag내의 공백이 아니라면
            if(c == ' ' && !isTag) {
                // stack에 문자가 있다면 pop
                while(!stack.isEmpty()) {
                    bw.write(stack.pop());
                }
                bw.write(" ");
            }
            // '<'라면
            else if(c == '<' && !isTag) {
                isTag = true;
                while(!stack.isEmpty()) {
                    bw.write(stack.pop());
                }
                bw.write(c);
            }
            // tag의 마지막이라면
            else if(c == '>' && isTag) {
                isTag = false;
                bw.write(c);
            }
            // tag 내의 문자라면
            else if(isTag) {
                bw.write(c);
            }
            // 일반 문자라면
            else {
                stack.push(c);
            }
        } // end of for...

        while(!stack.isEmpty()) {
            bw.write(stack.pop());
        }

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

'Baekjoon' 카테고리의 다른 글

[백준] 1406번 에디터 (Java)  (0) 2024.03.07
[백준] 1158번 요세푸스 문제 (Java)  (0) 2024.03.06
[백준] 2164번 카드2 (Java)  (1) 2024.02.28
[백준] 1920번 수 찾기 (Java)  (1) 2024.02.27
[백준] 9012번 괄호 (Java)  (3) 2024.02.27