6-D 시간복잡도 관련 질문입니다
안녕하세요 선생님 수업 듣는 중에 의문점이 생겨서 질문드립니다.
6-D(7795) 번 문제 같은 경우에는 입력값의 범위가 1~20000까지로 완전 탐색으로 풀게 된다면
n^2의 시간복잡도를 가져 시간 초과가 날 줄 알았습니다.
하지만 그렇게 풀어보니 시간 초과가 나지 않고 정상적으로 통과가 되네요
어떤 이유 때문인지 궁금합니다!
#include<bits/stdc++.h>
using namespace std;
int T, N, M, num;
vector<int> A;
vector<int> B;
int main() {
cin >> T;
while (T--) {
cin >> N >> M;
A = vector<int>(N);
B = vector<int>(M);
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < M; i++) cin >> B[i];
sort(A.begin(), A.end());
sort(B.begin(), B.end());
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (A[i] > B[j]) {
cnt++;
}
else break;
}
}
cout << cnt << "\n";
}
return 0;
}
답변 1
0
안녕하세요 조태님 ㅎㅎ
A = vector<int>(N);
B = vector<int>(M);
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < M; i++) cin >> B[i];
sort(A.begin(), A.end());
sort(B.begin(), B.end());코드를 보시면 잘한점이
sort부분입니다.
이렇게 해서 완탐을 하더라도 어떤 경우의 수에 있어서는 빠르게 탐색이 가능하도록 하신 것이죠.
예를 들어
5 6 7 8
1 2 3 9
이런경우에 빠르게 탐색이 가능하겟죠?
이 때문에 통과가 나는 것 같습니다.
n^2의 시간복잡도를 가져 시간 초과가 날 줄 알았습니다.
>> 정확히는 N * M 의 시간복잡도를 갖고
조태님이 말씀하신 것처럼 4억의 시간복잡도를 갖어서 보통은 통과가 되지 않는 코드가 맞습니다만
내부적으로 저런 유형의 테케가 여러개 있을 수도 있으며
원래 4억이라고 해서 보통은 통과가 안되는데 어떤 문제에 따라 시간초과 범위를 넓게 주는 경우도 있어서 그렇습니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
4 - A
0
10
1
코딩살구클럽 입장이 안됩니다
0
50
2
4-F 경우의 수 질문입니다.
0
30
2
코딩살구클럽 가입이 안됩니다.
0
64
2
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
54
1
교안 158페이지 문의드립니다
0
44
2
코딩살구클럽 관련 건의사항
0
107
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
44
1
진행 방법 질문드립니다!
0
78
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
63
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
309
2
백준 서비스 종료
9
943
1
sk 하이닉스 코테 대비
0
382
2
3-G 최댓값 질문
0
54
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
63
2
3-N 질문 있습니다.
0
68
2
학습방법
0
105
2
4-H 질문 있습니다 (코드 리뷰)
0
68
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
180
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
71
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
53
2





