kjho1037   4년 전

안녕하세요.

스택 수열을 푸는 중인데 아무리 생각해도 예외가 딱히 없는데 계속 틀리길래

친구한테 물어보니..자기는 c++로 복붙 했는데 맞다고 하네요.

그래서 저도  c++로 제출하니 맞았습니다ㅜ,ㅠ

시간 엄청 소비했는데.......ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

C로 제출하면 틀리고 C++로 제출하면 맞는 이유를 여쭈어보고 싶습니다!

sung1104hyun   4년 전

일단 틀리는 원인은 d배열이 10만 넘어가기 때문인것 같네요.

예시 주어진거만 봐도 입력크기는 8인데 출력은 8보단 많이 출력해야하니까요.

그냥 d를 100만으로 잡아보니까 통과되네용.. c++에서 왜 되는지는 잘모르겠네요... 안되야 할거같은데

simm4256   4년 전

배열 크기 문제가 맞고요

밑에 소스를 돌려보시면 아시겠지만

오류가 나지 않고 제대로 출력이 나옵니다.

배열이 메모리에 연속된 공간을 사용하기 떄문인데

int a[2]라고 선언한건 "이 배열은 2칸의 메모리를 사용하겠다"는거지만

사실 operator[] 를 사용할 땐 해당 배열의 크기가 몇인지 검사를 하지 않습니다.

한마디로 아래 코드에서 a[3]을 사용하면

a에서 3칸 더 간 메모리에 접근하는 겁니다.

이 문제는 수의 개수가 10만이면 정답의 개수는 최대 20만입니다. (한 숫자당 +하나 -하나 나온다고 생각해보세요)

그래서 d배열을 저렇게 선언하셨어도, d부터 d+20만까지의 메모리가 사용이 가능하다면 AC가 뜰겁니다.

아무래도 C랑 C++을 컴파일할 때 메모리를 잡는 부분이 다르거나 해서 C++은 AC가 뜨는 것 같네요.

C를 컴파일 할 땐 d+100001~d+200000까지의 메모리중 어딘가가 이미 사용이 되고있거나 접근이 안되거나 하기때문에 정답이 아니겠죠.

해결방법은 윗분이 말씀하셨듯 d배열을 20만 이상으로 늘리면 됩니다.

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