Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 순열
- 백트래킹
- C++
- C++1167
- 인덱스 트리
- 16933
- BFS
- 투포인터
- 백준 숨바꼭질5
- 문자열
- 조합론
- 프로그래머스
- 조합
- 백준
- C++ 1937
- 다익스트라
- 백준 17071
- LIS
- 가장 긴 증가하는 부분 수열
- c언어
- strtok
- DP
- DFS
- 알고리즘
- 소트 게임
- C++ 17071
- Backtracking
- C++ 1918
- C++1967
- 위상정렬
Archives
- Today
- Total
블로그
[C, C++] strlen의 시간복잡도 (백준 3986: 좋은 단어) 본문
728x90
<string.h> 안에 들어있는 strlen 함수
얘는 char str[500]; 같은 얘의 len을 구할 때 사용되는데
아마도 인덱스 0부터 NULL문자('\0')가 나올 때까지 무식하게 읽나 보다; 하긴 그거 말고 길이를 구할 방법이 없네
그래서 그런지 (문제에 따라 다르긴 하지만) for문안에 쓰면 시간초과가 나올 확률이 높다
원래는 나도 저런 정보를 for문안에 써야할때
무조건 변수로 빼줘서 저장하고 쓰는데,
한번 안 그랬다고 시간초과가 나서...
경각심을 가지기 위해..
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int main() {
int N;
scanf("%d", &N);
char row[100001];
int ans = 0;
while (N--) {
scanf("%s", row);
if (strlen(row) & 1) continue;
stack<char> s;
int mi = strlen(row);
for (int i = 0; i < mi; i++) {
if (s.size() > mi - i) break;
if (s.empty()) s.push(row[i]);
else if (s.top() == row[i]) {
s.pop();
}
else {
s.push(row[i]);
}
}
if (s.empty()) ans++;
}
printf("%d", ans);
}
ㅋㅋ 이 문제 도대체 시간초과가 왜 나지 O(백만)인데 하면서
어떻게든 시간초과를 없애려고 노력한 부분
if (s.size() > mi - i) break;
하지만 이유는 그냥 N번 반복하는 for문에서
strlen을 사용했으므로
문자열 길이가 최대 100,000 이므로 N*100,000 이 된다.. 는 그런 거다
int mi = strlen(row);
for (int i = 0; i < mi; i++) {
...
}
int 변수 하나만으로도 개선되는 놀라운 시간 복잡도!
역시 자료구조를 많이 쓸수록(공간복잡도를 늘릴수록) 시간복잡도 및 알고리즘을 쉽고 간단화할 수 있다는 게 맞다
https://www.acmicpc.net/problem/3986
3986번: 좋은 단어
이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에
www.acmicpc.net
'PS' 카테고리의 다른 글
[C++] 백준 14226 : 이모티콘 (0) | 2023.03.04 |
---|---|
[C++] 백준 11052: 카드 구매하기 (0) | 2023.02.26 |
[C++] 백준 5430 : AC (0) | 2023.02.12 |
[C++] 백준 7662 : 이중 우선순위 큐 (0) | 2023.02.12 |
[C++] 백준 1107: 리모컨 (0) | 2023.02.11 |
Comments