• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

5 - B stack 풀이 질문

23.09.13 14:23 작성 조회수 93

0

안녕하세요, 강사님의 강의를 수강하며 코딩테스트를 준비하고 있는 수강생입니다.

강사님의 좋은 코드 설명과 양질의 코드로 항상 감사하게 생각하고 있는데요,

다름이 아니라 제가 5 - B 문제를 풀다가 질문이 생겨서 글을 올리게 되었습니다.

저는 해당 <문자열 폭발> 문제를 읽자마자 '아 여느 괄호 연쇄 폭발 문제랑 비슷하구나' 라는 생각이 들어서

스택으로 문제 풀이 가닥을 잡게 되었는데, 그 와중에 전과는 다르게 폭발하는 string의 길이가 길어 졌으니

매번 탐색을 해주어야겠다, 시간 복잡도도 괜찮을 것 같다! 라는 생각에 코드를 작성해봤습니다.

생각보다 정답 풀이가 저의 풀이와 비슷해서 기분도 좋았는데, 왠지 모르게 시간초과가 계속 발생합니다.


<질문>

어느 부분을 고치면 시간 초과를 없앨 수 있을까요?

그리고 이러한 시간 초과를 겪지 않으려면 어떤 코딩 방식을 지향해야할까요? (이건 개인적으로 지금 발생하고 있는 문제가 제 코드 작성 습관과 관련이 있디고 생각해서 적었습니다.)

#include<iostream>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<climits>
#include<algorithm>

using namespace std;

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

  string str; cin >> str;
  string bomb; cin >> bomb;
  stack<char> s;

  int len = str.length();
  int bomb_len = bomb.length();

  for(int i = 0; i < len; i++) {
    char now = str[i];

    // 폭탄을 확인할 만큼 stack이 큰지 확인
    // 폭탄을 넣을 만큼 크지 않다면 그냥 stack에 문자 넣기
    if(s.size() >= bomb_len - 1 && now == bomb[bomb_len - 1]) {
      // 폭탄 글자 길이 만큼 스택에서 글자 우선 뽑기
      string token;
      token = token + now;

      for(int j = 1; j < bomb_len; j++) {
        token = token + s.top();
        s.pop();
      }

      reverse(token.begin(), token.end());

      // 뽑은 문자열이 폭탄 글자인지 확인
      // 폭탄이 아니라면 다시 넣어주고 폭탄이면 뺀 문자열 그냥 버림
      if(token != bomb) {
        for(int j = 0; j < bomb_len; j++) {
          s.push(token[j]);
        }
      }
    }
    else {
      s.push(now);
    }
  }

  if(s.empty()) {
    cout << "FRULA";
  } else {
    string answer;
    int ans_len = s.size();

    for(int i = 0; i < ans_len; i++) {
      answer = answer + s.top();
      s.pop();
    }

    reverse(answer.begin(), answer.end());
    cout << answer;
  }
}

답변 2

·

답변을 작성해보세요.

1

안녕하세요 0320님 ㅎㅎ

이부분의 원리는 다음과 같습니다.

+의 경우.

+를 쓰게 되면 "새로운 문자객체"를 반환하기 때문에 해당 부분에 대한 코스트가 들고.

 

+= 를 쓰게 되면

해당 문자열을 추가해 확장하는 것이기 때문에 확장하는 부분에 대한 코스트가 듭니다.

 

이 미묘한 차이 때문에 해당 부분이 발생되는 것 같습니다.

다만 지역변수 사용법 이부분이 좀 잘못된 부분이 있는데요.

초기화를 다음과 같이 하셔야 합니다.


      string token = "";
      token = token + now;

...
    string answer = "";
    int ans_len = s.size(); 

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

와~우 방금 제가 혹시..? 해서 이것저것 고쳐보았는데요

string = string + temp_string

이것과

string += temp_string

의 로직이 달라서 그런 것으로 파악 되었습니다 ㅠㅠ

이제는 += 을 적극 활용하도록 해야겠습니다

https://cplusplus.com/reference/string/string/operator+=/