4-L split 함수 사용 시 시간 초과
557
投稿した質問数 19
강사님 안녕하세요,
4-L 문제 숫자 배열 입력받는 부분을 split 으로 구현을 해보았지만 시간초과가 발생을 해서요..
http://boj.kr/45ac0094d780431c9678842e88c8c48a
강사님 풀이와 같이 개별 char 에 대해 순차적으로 판단하여 바로 바로 container 에 push_back 하는 것이 확실히 더 빠를 것 같다고 생각은 됩니다..
split 함수 로직 자체가 token 을 만들어가면서 input string 에 대해 1회 탐색을 하게 되는 것이라 그렇게 오래 걸릴까? 싶긴한데요. string 에서 int 로 변환시키는 stol 함수가 문제인걸까요?
回答 2
1
안녕하세요 ㅎㅎ
일단 로직 자체는 문제가 없습니다.
split, reverse, size체킹, pop 로직 정말 잘 짜셨네요.
네 다만 split에서 그런 시간초과가 나는 거 같습니다.
split을 잠깐보면
while ((pos = input.find(delimiter)) != string::npos)
{
token = input.substr(0, pos);
ret.push_back(stoi(token));
input.erase(0, pos + delimiter.length());
}이렇게 되어있습니다. find 자체의 시간복잡도가 O(N)이기 때문에 이를 계속해서 실행하기 때문에 최악의 경우 O(N^2) 정도가 되버리기 때문에 그러는 것 같습니다.
해당부분을 이렇게 한 번 바꿔 볼까요?
for(char c : str_num){
if(c == '[' || c == ']') continue;
// 숫자가 나오면 현재 수*10 한 뒤 더함
if(c >= '0' && c <= '9') x = x*10 + c-'0';
// 아닐 경우 현재 수를 덱에 넣음
else{
if(x > 0) numbers.push_back(x);
x = 0;
}
}
if(x > 0) numbers.push_back(x);아 그리고
이 문제는 숫자 자체가 int형이 들어오기 때문에
ret.push_back(stoi(token));이렇게 쓰는 것이 좋습니다.
전체 코드는 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
int T; // max 100
string p; // functions
int N; // number of elements
string str_num;
deque<int> split(string input, string delimiter)
{
// cout << "input = " << input << "\n";
deque<int> ret;
long long pos = 0;
string token = "";
while ((pos = input.find(delimiter)) != string::npos)
{
token = input.substr(0, pos);
ret.push_back(stoi(token));
input.erase(0, pos + delimiter.length());
}
if (input.length() > 0)
{
ret.push_back(stoi(input));
}
return ret;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> T;
while (T--)
{
deque<int> numbers;
bool error = false;
bool dir = true;
cin >> p;
cin >> N;
cin >> str_num;
int x = 0;
for(char c : str_num){
if(c == '[' || c == ']') continue;
// 숫자가 나오면 현재 수*10 한 뒤 더함
if(c >= '0' && c <= '9') x = x*10 + c-'0';
// 아닐 경우 현재 수를 덱에 넣음
else{
if(x > 0) numbers.push_back(x);
x = 0;
}
}
if(x > 0) numbers.push_back(x);
for (char func : p)
{
if (func == 'R')
{
dir = !dir;
}
else if (func == 'D')
{
if (numbers.size())
{
if (dir == true)
{
numbers.pop_front();
}
else
{
numbers.pop_back();
}
}
else
{
error = true;
break;
}
}
}
if (error)
{
cout << "error\n";
}
else
{
if (dir == false)
{
reverse(numbers.begin(), numbers.end());
}
cout << "[";
for (int i = 0; i < numbers.size(); ++i)
{
cout << numbers[i];
if (i < numbers.size() - 1)
{
cout << ",";
}
}
cout << "]\n";
}
}
return 0;
}
감사합니다.
진행 방법 질문드립니다!
0
30
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
55
2
2주차 개념#12 트리 순회
0
25
2
백준사이트가 종료된다고 합니다.
0
284
2
백준 서비스 종료
9
882
1
sk 하이닉스 코테 대비
0
367
2
3-G 최댓값 질문
0
50
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
83
2
3-I 코드 질문드립니다.
0
62
2
3-N 질문 있습니다.
0
66
2
학습방법
0
102
2
4-H 질문 있습니다 (코드 리뷰)
0
66
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
169
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
69
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
64
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
51
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
68
2
함수별 시간복잡도
0
73
2
3-h 질문입니다.
0
49
1
안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.
0
53
2
1-I 문제 질문 드립니다.
0
76
2
2-P 질문입니다.
0
56
1
mac에서 시작하기 관련
0
91
2
5-Q 질문
0
64
2

