Logo
(追記) (追記ここまで)

시간복잡도에 대해 질문이 있습니다

11478번 - 서로 다른 부분 문자열의 개수

시간복잡도에 대해 궁금해서 글을 쓰게 되었습니다.

문제에서 문자열의 길이는 1000이하라고 되어있고 시간제한은 1초입니다.

제가 짠 코드에서 만약 길이가 1000인 문자가 들어오면 적어도 10억번은 실행될것같은데요.
그렇게 되면 1초만에 못끝내지 않나요? 왜 정답이 되었는 지 궁금합니다. 단순히 테스트 케이스에 길이가 1000인 문자가 없었던 것일까요...

일단 제출후 실행시간은 496ms가 나왔습니다.

이 제출란에 있는 시간도 궁금한 것이 있는데 여기 나와있는 실행시간은 각각의 테스트케이스 실행시간의 평균인가요?

질문정리)

1. 길이가 1000인 문자열이 들어오면 시간초과가 되야하는것이 아닌가?

2. 제출란에서 정답이었을 때 나오는 시간은 각 실행시간의 평균인지? (아니면 테스트 케이스중 제일 오래걸린시간?)

1.(削除)
작성하신 코드의 시간복잡도는 O(N3)처럼 보입니다만, 좀 더 고려해볼 사항이 있습니다. (削除ここまで)

(削除) i, j에 따라 substr의 길이가 달라질 수 있습니다. 길이가 1인 경우가 2N번, 2인 경우가 2(N-1)번, 3인 경우가 2(N-3)번, ...
따라서 모두 합하면 N(N+1)이고 O(N2)이 됩니다. (削除ここまで)

제가 잘못 생각했네요. 아래 분 답변을 보시면 될 것 같습니다.

2. 제일 오래걸린시간입니다.

@skuru 세제곱이 맞습니다. 문자열의 개수에 길이를 곱하는 걸 깜빡하신 듯 하네요. 제곱이면 496ms씩이나 안 나옵니다.

최대 크기 또는 최대에 근접하는 크기의 테스트 케이스가 적어도 하나는 있는 것이 당연하며, 수행 시간은 전체 케이스 중 최댓값으로 표시됩니다. 채점 정보

$$\sum_{i=0}^{n-1} \sum_{j=1}^{n-i} j = \frac{1}{6}(n^3 + 3n^2 + 2n)$$

으로, n=1000에 대하여 총 연산량은 1.7억 정도이며 많은 언어에서 1초 이내로 커버됩니다.

세제곱이기는 하지만 set을 제외하면 상수가 작아 부분문자열들을 뽑는 것 자체는 충분히 빠릅니다. 하지만 set 때문에 최악의 경우는 세제곱 로그가 될 수도 있어 보이는데, 이건 데이터가 약하지 않은지 확인해봐야할 듯 합니다. 다만 길이가 1000인 걸 아무거나 넣는다고 시간 초과가 날 정도로 느린 코드는 아닙니다.

답변 주신 모든 분들 감사합니다!! 수행시간은 최대값이였군요

게다가 2번째 반복문의 j가 leng-i까지인것을 생각 못했네요..

러프하게 첫번째 반복문 1000, 두번째 반복문 500, substr 500, insert(log500) 잡으면 10억은 안나오겠군요!

추가적인 궁금증이 있는데 여러 인터넷글들에서

어떤 글을 1초에 1억번의 연산을 할 수 있다고 하고 어떤 글은 1초에 3-5억번의 연산을 할 수 있다고 나와서 저는 1초에 1억번의 연산을 기준으로 잡고 문제를 풀고 있었는데 혹시 댓글 주신 분들은 1초에 몇번의 연산을 기준으로 하고 계실까요?

저는 '가벼운 연산' 기준 1초에 10억 정도를 기준으로 잡는데, 이 연산의 '무게'라는 것이 생각하시는 것과 굉장히 다를 수 있기 때문에 단순히 문장의 개수만으로 속도를 예측하는 것은 매우 부정확합니다.

https://djm03178.tistory.com/2...

글 잘읽었습니다 감사합니다!

댓글을 작성하려면 로그인해야 합니다.

(追記) (追記ここまで)

출처

대학교 대회

  • 사업자 등록 번호: 541-88-00682
  • 대표자명: 최백준
  • 주소: 서울시 서초구 서초대로74길 29 서초파라곤 412호
  • 전화번호: 02-521-0487 (이메일로 연락 주세요)
  • 이메일: contacts@startlink.io
  • 통신판매신고번호: 제 2017-서울서초-2193 호

AltStyle によって変換されたページ (->オリジナル) /