huitseize   4년 전

안녕하세요, 시간초과로 계속 틀려서 결국 질문드립니다. 우선 제 코드는 오름차순 정렬 후 최소,최대 값을 출력하는 방식입니다.

컴파일 및 예제 출력시에는 문제가 전혀 없지만 익숙하지 않은 경고들이 3개정도 뜨는데 이것 때문이 아닌가 싶어서 질문드립니다.

19행에서는 C6385의 오류가 나타나고, 22행에서는 C6386의 오류가 나타나며, 마지막으로 33행에서는 C6011의 오류가 나타납니다.

무엇때문에 이런 오류가 나타나는지, 오류 해결 방법은 없는지 궁금합니다.

포털 사이트에 개인적으로 오류코드 검색도 많이 해봤는데 이해가 잘 되지 않습니다.

검색하면서 제가 이해한 저 경고문은,

동적할당시에 동적할당이 실패할 경우에 대해 문제가 될 것을 경고하는 것으로 이해하고 있는데, 제 이해도 맞는 지 궁금합니다.


rhdqor213   4년 전

15번째 줄~26번째 줄의 코드의 시간 복잡도가 O(n^2)이므로 n의 제한이 100만인 이 문제에선 당연히 시간초과가 납니다.

lekonell   4년 전

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; 등 없는 인덱스에 값을 넣으려는 시도

huitseize   4년 전

@rhdqor213 덧글 작성자님 덕분에, 시간 복잡도에 대해 처음으로 공부하게 되었습니다.
혹시 15~26줄에 시간 복잡도가 O(n^2)라고 해주셨는데, 저 for문 같은 경우에는 i,j 변수 두개가 서로 연관되어있는데
어떻게 O(n^2)라고 시간 복잡도를 간단히 계산하실 수 있는지 알려주실 수 있나요?

제 말이 이해가 되실 줄 모르겠는데... 간단히 요약하면 시간 복잡도를 쉽게 계산할 수 있는 방법이 있나요?
아 그리고 혹시... n^n 이 몇초다. 이런 기준이 있나요 ?

lekonell   4년 전

시간복잡도는 알고리즘의 수행 시간을 나타내는데,

질문자님은 내부의 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)가 되는 것입니다.


lekonell   4년 전

같은 O(N^2)인 알고리즘이라고 하더라도 수행조건이나 실행문의 개수 등으로 인해 동작속도에 차이가 클 수 있습니다만

대강 C는 1초에 1억 번 정도 (연산이 가능하다)로 생각하면 되는 것으로 알고 있습니다. (틀리다면 지적 부탁드립니다.)

huitseize   4년 전

@lekonell 님께 감사의 인사 먼저 드립니다.
사정이 생겨서 바로 덧글을 달지 못하고, 이제서야 남깁니다. 친절하신 설명 덕분에 잘 이해가 된 것 같습니다.
제 코드 속에 이중 for문에서, n값이 3이라고 가정을 하고 예를 들면 j가 가장 안쪽 for문을 빠져나올 때 j=2로 빠져 나오는데,
그 과정속에서 ptr[j+1]이 선언되지 않은 ptr[3]을 읽거나 쓴다고 컴파일러가 생각해서 경고한다고 이해하면 될까요?


huitseize   4년 전

@lekonell 님의 시간 복잡도에 대한 설명또한 너무 잘 적어주셔서 잘 이해했습니다.
차근차근 하나씩 적어보면서 계산하면 되는군요, 감사합니다!!!
"C는 1초에 1억 번 정도" 기억하면서 문제를 풀어 나가야겠네요. 고맙습니다^^.

lekonell   4년 전

그냥 단순히 메모리 침범 문제 등이 이런데서 일어날 수도 있으니 조심해달라... 정도가 아닐까 싶습니다. 경고는 경고일 뿐이니까요.

공식 문서를 보더라도 (https://docs.microsoft.com/en-us/visualstudio/code-quality/c6385?view=vs-2019) 딱히 와닿지는 않는 듯 합니다.

huitseize   4년 전

@lekonell ㅎㅎㅎ 답변 감사합니다. 이럴 수도 있구나 하고 넘어가야겠어요.

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