15번째 줄~26번째 줄의 코드의 시간 복잡도가 O(n^2)이므로 n의 제한이 100만인 이 문제에선 당연히 시간초과가 납니다.
10818번 - 최소, 최대
C6011은 malloc 등 메모리를 동적 할당하는 경우, 메모리 할당에 실패할 때를 미리 경고하는 것이 맞습니다.
다음의 링크를 참조하시면 될 것 같습니다. https://pang2h.tistory.com/196
C6385과 C6386은 버퍼 인덱스를 초과할 가능성이 있는 경우를 미리 경고합니다.
C6385: int Arr[n]; 으로 정의된 배열이 있을 때, Arr[n]이 읽기 대상에 있는 경우 등이 해당됩니다. (Arr의 인덱스는 0 ~ n-1 이므로, Arr[n]은 선언되지 않았습니다.)
C6386은 위에서 Arr[n]이 쓰기 대상에 있는 경우가 해당됩니다. ex: Arr[n] = 123; 등 없는 인덱스에 값을 넣으려는 시도
시간복잡도는 알고리즘의 수행 시간을 나타내는데,
질문자님은 내부의 for문인 for (j = 0; i+j < n - 1; j++) 가 i + j < n - 1일 때까지 수행하도록 되어있는데 O(N^2)임을 어떻게 알 수 있느냐는 의도로 질문하신 듯 합니다.
이를 천천히 계산해보면 다음과 같습니다.
i=0: j=0~n-2까지 반복 (n-1회)
i=1: j=0~n-3까지 반복 (n-2회)
i=2: j=0~n-4까지 반복 (n-3회)
...
i=n-4: j=0~2까지 수행 (3회)
i=n-3: j=0~1까지 수행 (2회)
i=n-2: j=0까지 수행 (1회)
1부터 K까지의 자연수의 합을 구하려거든 K(K+1)/2 로 구할 수 있으니,
위 식에서 K=N-1을 대입하면 N(N-1)/2 = N2/2 - N/2 임을 알 수 있습니다.
시간복잡도를 나타낼 때는 상수항을 제거하고 가장 영향력이 큰 항만을 남기므로, O(N^2)가 되는 것입니다.
그냥 단순히 메모리 침범 문제 등이 이런데서 일어날 수도 있으니 조심해달라... 정도가 아닐까 싶습니다. 경고는 경고일 뿐이니까요.
공식 문서를 보더라도 (https://docs.microsoft.com/en-us/visualstudio/code-quality/c6385?view=vs-2019) 딱히 와닿지는 않는 듯 합니다.
댓글을 작성하려면 로그인해야 합니다.
huitseize 4년 전
안녕하세요, 시간초과로 계속 틀려서 결국 질문드립니다. 우선 제 코드는 오름차순 정렬 후 최소,최대 값을 출력하는 방식입니다.
컴파일 및 예제 출력시에는 문제가 전혀 없지만 익숙하지 않은 경고들이 3개정도 뜨는데 이것 때문이 아닌가 싶어서 질문드립니다.
19행에서는 C6385의 오류가 나타나고, 22행에서는 C6386의 오류가 나타나며, 마지막으로 33행에서는 C6011의 오류가 나타납니다.
무엇때문에 이런 오류가 나타나는지, 오류 해결 방법은 없는지 궁금합니다.
포털 사이트에 개인적으로 오류코드 검색도 많이 해봤는데 이해가 잘 되지 않습니다.
검색하면서 제가 이해한 저 경고문은,
동적할당시에 동적할당이 실패할 경우에 대해 문제가 될 것을 경고하는 것으로 이해하고 있는데, 제 이해도 맞는 지 궁금합니다.