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점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
코딩 살구클럽 가입 문의
0
67
2
코딩살구클럽 가입문의
0
69
2
3-K private case 질문
0
66
2
안녕하세요. 코딩살구클럽 문의드립니다!
0
77
2
7:41 듣다가 질문합니다
0
77
2
코드 리뷰 요청드립니다!
0
83
2
코딩살구클럽 계정 문의
0
79
2
SK하이닉스 대비 강의수강
0
217
3
코딩살구클럽 등록부탁드립니다.
0
78
2
7-F 재귀로 풀시 런타임애러
0
75
1
1-N 문제 질문입니다. (+ 채점오류)
0
82
2
코딩살구클럽 가입 확인 부탁드립니다.
0
86
2
직장인 코테 합격 공부방법 문의
0
127
2
코딩살구클럽 가입 방법
0
96
2
6-H 체점 관련 질문
0
74
1
채점서버 연결 관련 질문입니다
0
101
2
삼성 s직군
0
88
1
삼성 코테 없어짐
0
212
1
코딩살구클럽 가입부탁드립니다
0
87
2
코딩살구클럽 가입 요청 확인부탁드립니다
0
69
2
5-S 테스트 케이스 질문
0
78
2
코살 문제풀이 환경
0
88
2
2 - T 오큰수 문제가 있는 것 같습니다.
0
81
1
추천 추가문제들
0
74
2





