알고리즘/BOJ

백준 17413번 단어 뒤집기 2

lheunoia 2021. 4. 18. 12:09

 

 

문제 보러가기 : https://www.acmicpc.net/problem/17413

 

 

 

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

 

이번 문제는 문자열 문제였습니다.

태그 안팎의 단어를 꺼낼 때 각각 큐(queue)와 스택(stack) 자료구조를 사용하였습니다. 😀

 

 

 

 

《문제 풀이》

 

1. 공백을 포함하여 출력하기 위해 getline() 함수로 문자열 입력

2. 태그 안의 단어는 큐에 넣고, '>' 를 만나면 큐에 있는 모든 문자를 결과 문자열에 합함

3. 태그 밖의 단어는 스택에 넣고, '<'를 만나면 스택에 있는 모든 문자를 결과 문자열에 합함

4. 공백일 경우, 현재 tag가 true 인지 검사하고 2 또는 3 진행

5. 마지막으로 스택에 문자가 남아있는지 확인하고 결과 문자열에 합함

 

 

 

《C++ 코드

 

#include <iostream>
#include <cstring>
#include <stack>
#include <queue>

using namespace std;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  string s;
  getline(cin, s);
  
  string result; // 결과 문자열
  stack<char> st; // 태그 밖의 단어 순서를 거꾸로 출력
  queue<char> q; // 태그 안의 단어 순서를 그대로 출력
  bool tag = false; // 태그 안팎 여부 검사

  for (int i=0; i<s.length(); i++) {
    if (s[i] == '<') { // 열린 태그이면 
      q.push('<');
      tag = true;
      while (!st.empty()) {
        result += st.top(); // 스택에 있는 모든 문자 더해줌
        st.pop();
      }
    } else if (s[i] == '>') { // 닫힌 태그이면
        tag = false;
        while (!q.empty()) {
          result += q.front(); // 큐에 있는 모든 문자 더해줌
          q.pop();
        }
        result += '>';
    } else if (s[i] == ' ') {
        if (tag) { // 태그 안의 공백이면
          while (!q.empty()) {
            result += q.front(); // 큐에 있는 모든 문자 더해줌
            q.pop();
          }
          result += " ";
        } else { // 태그 밖의 공백이면
          while (!st.empty()) {
            result += st.top(); // 스택에 있는 모든 문자 더해줌
            st.pop();
          }
          result += " ";
        }
    } else { 
      if (tag) { // 태그 안의 문자이면
        q.push(s[i]); // 큐에 삽입
      } else { // 태그 밖의 문자이면
        st.push(s[i]); // 스택에 삽입
      }
    }
  }
  // 스택에 남아있는 문자 출력
  while (!st.empty()) {
    result += st.top();
    st.pop();
  }
  
  cout<<result;
  return 0;
}

 

 

개발 환경: Visual Studio Code

 

 

 

baekjoon - 정답 화면

 

 

 

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 2583번 영역 구하기  (0) 2021.04.14
백준 2293번 동전 1  (0) 2021.03.18
백준 1120번 문자열  (0) 2021.03.07
백준 12852번 1로 만들기 2  (0) 2021.03.01
백준 2263번 트리의 순회  (0) 2021.02.25