bkim14   3년 전

소스1 은 pass하고

소스2는 fail인데,

바꾼거는 bool visit[51][51] 의 선언 위치밖에 없습니다.

(소스1은 line 12에, 소스2는 line11에 선언)

혹시 버그인지요?

djm03178   3년 전

버그라는 것이 채점 프로그램의 버그를 말씀하시는 거라면, 그럴 가능성은 없다고 보시면 됩니다.

코드 어딘가에 undefined behavior (예를 들면 배열 범위 침범) 가 있었고, 그 동작이 우연히도 배열이 선언된 상대적인 메모리 위치에 의해 정답과 오답으로 갈렸다고 보는 것이 제일 가능성이 높습니다.

채점 프로그램은 그저 프로그램을 컴파일하고, 실행하여 나온 결과를 정답과 비교하는 일을 할 뿐이기 때문에 코드의 내용이 채점 프로그램의 버그를 유발할 일은 없습니다.

bkim14   3년 전

두 소스가 다른 부분입니다:

---------------------------------------

1)

int range[2500 + 50];
bool visit[51][51];

2)
bool visit[51][51];

int range[2500 + 50];

---------------------------------------

보시다시피 선언 순서만 다른걸로 하나는 패스가 되고 하나는 패스가 안되는데 이런 경우는 처음이라 저도 황당하네요.

선언 순서 바꿔봤는데 패스가 되서 놀랐습니다.

djm03178   3년 전

코드를 자세히는 안 봤지만, 제가 말씀드리는 건 예를 들어 range[3000]과 같이 잘못된 행동을 프로그램이 했을 때, 선언 순서에 따라 그 메모리 주소가 visit이 할당된 위치와 겹칠 가능성이 있다는 뜻입니다. 그 여부에 따라 프로그램의 행동이 전혀 달라질 수도 있습니다.

sujin   3년 전

ex() 함수에서 l >= x인 경우가 발생합니다. 예를 들어 맵의 모든 고도가 동일하다면, 초기 상태(l = 0, r = 0, x = 1)에서 모든 집에 방문하는데 성공할 것이므로 l이 1로 증가하여 루프문이 진행됩니다. 이후의 range[l] (l >= x) 값은 0으로 초기화되어 있으므로, 역시 모든 집에 방문하는데 성공할 것입니다. 결국 while 문을 벗어나지 못하고 l이 계속 증가하여, range에 할당된 메모리를 벗어나면 위에서 말씀하신 메모리 문제가 발생합니다.

bkim14   3년 전

답변 감사합니다.

고도가 모두 같은 테케도 입력 해보니 답이 나와서 이 문제는 아닌가보다 했는데, 그런 케이스를 놓쳤네요.

코드도 꼼꼼히 봐주셔서 감사합니다.

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