Suhwanc

문제 링크 : https://www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

문제

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

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

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

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

 

입력

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

 

출력

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

 

풀이

스택 문제입니다.

이 문제는 두 가지 케이스로 나뉘어 풀어야 한다.

  • 태그일 때('<','>' 사이)
  • 태그가 아닐 때

왜냐하면, 태그일 때는 stack을 쓸 필요 없이 그냥 출력하면 되고, 태그가 아닐 때는 stack으로 거꾸로 뒤집어 출력하면 되기 때문이다.

따라서 나는 태그 안에 들어올 때('<')을 만날 때  만들어 둔 boolean 변수를 true로 , 빠져나올 때('>') false로 바꾸어 표시를 해주었다.

또한 여기서 중요한 건, '<'을 만날 경우 쌓아둔 문자열을 모두 pop 해서 출력해줘야 한다는 것이다.

처음에 궁금했던건 모든 상황에서 이게 통하는가? 였는데 모두 통한다.

  • 맨 처음에 '<'이 나오는 경우 -> stack이 비었기 때문에 출력 x
  • 연속으로 태그 문자열이 나오는 경우 -> 위와 동일

따라서, boolean값이 true면 무조건! 그냥 출력시켜버리고, false면 공백(' ') 또는 태그('<')가 나올 때까지 stack에 쌓고 이후 pop 하며 뒤집어 출력해주면 된다.

 

소스 코드

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
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
 
int main()
{
    string s = "";
    getline(cin, s);
    s += '\n';
    stack<char> st;
    bool check = false;
    for (int i = 0; i < s.size(); i++) {
        
        if (s[i] == '<') {
            while (!st.empty()) {
                printf("%c", st.top());
                st.pop();
            }
            printf("<");
            check = true;
        }
        else if (s[i] == '>') {
            printf(">");
            check = false;
        }
        else if (check) printf("%c", s[i]); //그냥 받자마자 출력하자
        
        else if (s[i] == ' ' || s[i] == '\n') {
            while (!st.empty()) {
                printf("%c", st.top());
                st.pop();
            }
            printf(" ");
        }
        else st.push(s[i]);
    }
    return 0;
}
cs

개발환경 : Visual Studio 2019

지적, 조언 언제든지 환영입니다~~

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

백준 4375번 1  (0) 2020.01.14
백준 2504번 괄호의 값  (0) 2020.01.08
백준 1874번 스택 수열  (0) 2020.01.08
백준 9093번 단어 뒤집기  (0) 2020.01.08
백준 9663번 N-Queen  (0) 2020.01.07