hwangtmdals   7년 전

배열 합치기 문제에 오류가 있습니다.

문제에서 총 저장 공간으로 최대 2,000,000 만큼의 배열의 원소가 입력되는데,

미천한 제 실력으로 최적화 되지 않은 코드를 제출 한 결과

#include <cstdio>
#include <algorithm>

using namespace std;

int check[1000002];
int ans[1000002];

int main()
{
int c = 0;
int a, b;
int it = 0;
scanf("%d %d", &a, &b);
for (int i = 0; i < a+b; i++)
{
int k;
scanf("%d", &k);
ans[it++] = k;
}
sort(ans, ans + a + b);
for (int i = 0; i < a + b; i++)
{
printf("%d ", ans[i]);
}

return 0;
}

에서는 정답이 출력되고

#include <cstdio>
#include <algorithm>

using namespace std;

int ans[1000002];

int main()
{
int c = 0;
int a, b;
int it = 0;
scanf("%d %d", &a, &b);
for (int i = 0; i < a+b; i++)
{
int k;
scanf("%d", &k);
ans[it++] = k;
}
sort(ans, ans + a + b);
for (int i = 0; i < a + b; i++)
{
printf("%d ", ans[i]);
}

return 0;
}

으로 check배열이 없는 상태에서는 런타임 에러가 뜹니다.

제 생각에는 문제 채점시 check배열의 공간을 ans로 가져다 쓰는 못된 버릇이 있는 듯 합니다.

오류 해결을 바랍니다



ntopia   7년 전

일단 두 코드 모두 check배열은 존재하지 않고

첫번째 코드엔 심지어 ans배열도 없습니다. 컴파일도 안될텐데요.

그리고 질문의 요지가 정확히 무엇인지 잘 모르겠습니다...

hwangtmdals   7년 전

사실 문제의 조건에 의하면 배열의 크기는 2000000 이상이 되어야지 문제를 정확하게 처리할 수 있습니다. 그러나 위쪽에 제시된 코드는 절반의 크기로도 맞았습니다! 가 출력되었는데 어떤 이유에서 그렇게 되었는지 궁금합니다.

ntopia   7년 전

대충 질문을 추측해보자면 배열범위를 넘어가는 상황인 것 같은데

c++ 표준은 배열 범위를 넘어가는 때의 동작을 정확하게 정의하지 않았습니다. 

https://en.wikipedia.org/wiki/Undefined_behavior

일반적인 아키텍쳐에서는 배열을 선언한 순서대로 메모리공간에 늘어놓기 때문에

배열범위를 넘어가는 코드를 짜도 "잘 돌아갈 수도" 있습니다.

어쨌든 이건 채점시스템의 버그가 아니고 그냥 아키텍쳐마다 동작이 다른 부분입니다.

프로그래머가 꼭 필요한 경우가 아니면 UB를 쓰지 않도록 해야죠..

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