malkompc   2년 전

안녕하세요! 4673번 문제를 풀던 중 궁금한 것이 생겨 질문글을 올립니다.

우선, 제가 푼 방식은 1부터 10000까지의 숫자 중 셀프넘버가 아닌 수들을 제외하는 방식입니다.


순서는 다음과 같습니다.

1.메인 함수 밑에 문제에서 언급한 방법대로 새로운 수를 만드는 함수를 만들었습니다.

2.메인함수에서 크기 10000의 배열(arr)을 선언한 후, 1에서 만들어진 함수에 1부터 10000까지의 숫자를 넣어 계산한 결과를 배열에 넣는다.

3.이중 for문을 사용해 1부터 10000까지의 숫자들을 배열 arr에 있는  수와 일일이 비교하여 배열 arr에 없는 수를  한 줄씩 출력하도록 한다.

문제는 배열arr 크기를 10000으로 했을 때, 출력 예시와 똑같이 답은 나오지만 정답이 아니라고 안내가 나온다는 것입니다.

생각1.

그래서 배열 크기에 문제가 있다 생각했습니다. 배열 arr에는 1부터 10000까지 1만 개의 숫자가 들어가야 하니 디폴트로 10000의 크기가 필요하고, 거기에 마지막에 null도 들어가야 하니 자리 하나가 더 필요하다고 생각했습니다. 


생각2.

여기에 더해 바로 밑의 i를 인자로 가지는 for문에서 arr의 인덱스 0부터 9999까지가 아니라 1부터 10000까지 삽입을 하므로 자리가 추가적으로 하나 더 필요해 총 10000 + 1 + 1인 10002만큼의 공간이 필요하다고 생각했습니다.


문제 : 그런데 10002를 넣어도 정답이 나오고 10001을 넣어도 정답이 나옵니다. 위에서 제가 잘못 생각한 것이 있는 것인가요? 아니면 다른 문제가 있는 것일까요? 고수분들의 도움 부탁드립니다ㅠㅠ 

긴 질문 읽어주셔서 감사합니다!

djm03178   2년 전

배열의 크기를 넘어서는 것은 undefined behavior이므로 정답이 나와도 정상이고, 오답이 나와도 정상입니다. 또는 시간 초과나 메모리 초과나 그 어떤 결과가 나오는 것도 모두 가능합니다.

malkompc   2년 전

아앗 오류가 아니라 그냥 권장되는(?) 답안에 맞지 않아서였나 보군요ㅎㅎ

답변해 주셔서 감사드립니다!!:)

djm03178   2년 전

권장...이랄까 이 문제의 답은 그냥 하나뿐입니다. 그 답이 출력되지 않으면 틀렸습니다를 받습니다.

직접 돌려보셨을 때 제대로 나왔더라도 undefined behavior라는 것은 환경에 따라 얼마든지 동작이 달라질 수 있다는 뜻이기 때문에 채점 환경에서 정답이 나와야 정답 판정을 받습니다.

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