인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

amenable님의 프로필 이미지
amenable

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

4-L

vector를 이용할 시 시간초과 문제발생

작성

·

264

0

안녕하세요.

해당 문제를 vector로 풀려고 하는데 계속 시간 초과가 발생해서 질문을 드립니다.

혹시 어느 부분에서 시간초과가 발생하는지 알 수 있을까요?

vector자체가 시간이 조금 많이 걸리는 걸까요?

#include<bits/stdc++.h>
using namespace std;
int T, n, num;
string p, l;
vector<int> v;
bool rev, error;


int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> T;
	while(T--){
		rev = false;
		error = false;
		cin >> p >> n >> l;
		
		for(char c : l){
			if(c >= '0' && c <= '9'){
				num = num * 10 + (c - '0');	
			}
			if((c == ',' || c == ']') && num > 0){
				v.push_back(num);
				num = 0;	
			}
		}
		
		for(char c : p){
			if(c == 'R')
				rev = !rev;
			else{
				if(v.size()){
					if(rev)
						v.pop_back();
					else
						v.erase(v.begin());
				}
				else{
					error = 1;
				}
			}
		}
		
		if(error){
			cout << "error\n";
		}
		else{
			if(rev)
				reverse(v.begin(), v.end());
				
			cout << "[";
			
			for(int i = 0; i < v.size(); i++){
				cout << v[i];
				if(i < v.size() - 1)
					cout << ",";
			}
			cout << "]\n";
			
		}
		v.clear();		
	}
}

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. ㅎㅎ

vector를 사용해서라기보다는

vetor의 erase때문에 그렇습니다. erase의 시간복잡도는 최악의 경우 O(N)의 시간복잡도를 가집니다. begin부터 해서 O(1)인 것 같지만 최악의 시간복잡도가 그러합니다.

그렇기 때문에 deque를 써야 하는 것이죠. deque의 pop_front()는 무조건 O(1)의 시간복잡도거든요.

감사합니다.

amenable님의 프로필 이미지
amenable

작성한 질문수

질문하기