코드의 수행시간이 어떻게 되나요? 가령이면, 매 질문이 모든 원소에 대해 가장 작은 수를 찾는다고 해 봅시다.
7469번 - K번째 수
일단... 입/출력 부분을 제외하고 n=1000으로 하고, 수열을 1~1000까지(순서는 랜덤) 섞고, m=2로 해 보았습니다.
하나는 1~1000번째(즉, 수열 전체) 중 1번째 수,
또 하나는 100~500번째 중 200번째 수로 테스트 해 보았는데요,
결과가 거의 바로 나왔습니다.
(물론, Ubuntu에서 테스트 했습니다.)
하지만, n이 커지면 즉, 입력의 2번째 줄의 길이가 늘어나면,
일정 길이(C에서는 약 4KB, Java에서는 약 8KB)만큼만 읽히고 나머지는 잘리는 현상이 발생합니다.
따라서, 제가 테스트를 못한다는 것이죠.
여기에서는 n의 최댓값이 100000인데, 2000인 경우도 테스트를 못하고 있습니다.
어쩌면 좋을까요? ㅠ.ㅠ
시간복잡도의 개념에 대해 들어보신 적 있나요?
프로그램이 수행되는 연산 횟수를 대략적으로 나타내는 지표입니다.
현재 작성하신 코드는 M번의 쿼리에 대해, NlogN의 시간복잡도를 가지는 정렬을 매번 하고 있으니 총 MNlogN의 시간복잡도를 가집니다.
최대 입력인 N=10만, M=5000을 대입해 보면 85억 가량이고, 보통 프로그램의 수행 시간을 1초당 1억 번 가량으로 잡으니
너무 오래 걸립니다. 10배 빨라져도 시간제한을 거의 열 배 가까이 초과하는, 너무 느린 코드예요.
이 문제를 푼 사람들은 다른 시간복잡도를 가지는, 이론적인 계산량 자체가 훨씬 적은 솔루션을 작성하여 통과했다는 의미입니다.
이 문제는 기초적인 알고리즘이나 코드 레벨에서의 최적화로 해결할 수 있는 수준을 넘어, 좀 멀리 가야 하는 문제입니다.
심화 자료구조를 이용해야 풀 수 있는 문제이고, 현재 푸신 문제를 보았을 때, 아직 이 자료구조를 익히시기엔 조금 이른 시기가 아닌가 싶습니다.
안타깝지만 조금 더 강해져서 돌아와야 한다.. 라는 의미입니다 ㅠㅠ
나중에 고급 알고리즘과 자료구조를 배우신 뒤에 다시 한번 시도해 보세요!
댓글을 작성하려면 로그인해야 합니다.
ldw2614 5년 전
제가 어제부터 이 문제 하나에만 몰두하고 있어요 ㅠ.ㅠ
C 언어와 Java 언어 모두 시도해 보았지만...
결국 모두 시간 초과가 뜨고 말았어요...
혹시나 해서 Ubuntu로 테스트 해보니...
한 줄에 입력 할 수 있는 문자열의 길이가 제한되어 있는것 같았어요...
어떻게 하면 좋을까요?
(혹시나 해서 Java 소스 첨부해요... 이클립스에서는 잘 돌아가요...)