5 - B stack 풀이 질문
안녕하세요, 강사님의 강의를 수강하며 코딩테스트를 준비하고 있는 수강생입니다.
강사님의 좋은 코드 설명과 양질의 코드로 항상 감사하게 생각하고 있는데요,
다름이 아니라 제가 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
의 로직이 달라서 그런 것으로 파악 되었습니다 ㅠㅠ
이제는 += 을 적극 활용하도록 해야겠습니다
코딩 살구 클럽 컴파일 에러
0
4
1
추천 문제
0
7
1
코딩살구클럽 승인
0
9
1
코살구 1주차 1940번 문제 조건과 프라이빗 테스트 불일치 문의
0
21
2
문제를 고민하는 시간 관련
0
25
2
코딩살구클럽
0
38
2
코딩살구클럽 문의
0
37
2
코딩살구클럽 승인
0
35
2
DP 경우의 수 설명이 이해가 되지 않습니다.
0
33
2
3-F 채점 관련 질문
0
31
1
BFS, DFS 활용이 되는 상황에서의 방향성
0
33
2
코딩살구클럽 승인
0
45
2
코딩살구클럽승인
0
39
3
코딩살구클럽 승인
0
54
2
3-D 관련 질문
0
35
2
코살구 회원가입 문의
0
45
2
코살구 로그인 문제
0
65
2
3-A 문제 풀이 관련 질문
0
56
3
2-O 질문 있습니다
0
38
2
2-T 문제에 관한 질문
0
40
2
코딩 살구 클럽 접속 및 사용방법 문의
0
63
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
67
2
코딩살구클럽 로그인문제
0
85
3
코딩 살구 클럽 로그인 문제
0
86
2





