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

조태님의 프로필 이미지
조태

작성한 질문수

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

6-D

6-D 시간복잡도 관련 질문입니다

해결된 질문

작성

·

180

·

수정됨

0

안녕하세요 선생님 수업 듣는 중에 의문점이 생겨서 질문드립니다.
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억의 시간복잡도를 갖어서 보통은 통과가 되지 않는 코드가 맞습니다만

  1. 내부적으로 저런 유형의 테케가 여러개 있을 수도 있으며

  2. 원래 4억이라고 해서 보통은 통과가 안되는데 어떤 문제에 따라 시간초과 범위를 넓게 주는 경우도 있어서 그렇습니다.

 

 

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

조태님의 프로필 이미지
조태

작성한 질문수

질문하기