purpose   4년 전

채점번호 : 16869480 

위의 소스코드를 제출하니 맞았습니다!!가 나오는데

실제로 코드를 이용해서 컴파일한 후에

99990

를 입력하면 

1 <= n <=100000 인 n을 입력했으므로 답이 출력되어야 하는데

답이 나오지 않습니다. 근데 맞았다고 나옵니다.

djm03178   4년 전

10만보다 작거나 같아야 할 이유가 없습니다. 입력의 제한이 10만이라고 해서 출력도 10만 이하인 건 아닙니다.

해당 코드는 제대로 된 답을 출력합니다.

purpose   4년 전

@djm03178 

제 말뜻은 그런 의미가 아니라 입력을 100000 이하 단위로 했는데

출력값이 나오지 않는데 accept를 받았다는 뜻이었습니다

출력은 long long 범위로 했습니다.

djm03178   4년 전

제가 직접 돌려봤는데 잘 나옵니다.

온라인 컴파일러에서 돌려봐도 잘 나옵니다. https://ideone.com/53LXbX

purpose   4년 전

아.. ideone에서는 나오네요

같은 코드인데 codeforce로 돌렸는데 답이 안나와서요.. ㅠㅠ 컴파일 환경을 다시 봐야겠네요

djm03178   4년 전

거기서도 돌려봤는데 잘 나오는 거 같습니다.

preview

purpose   4년 전

앗..; codeforce랑 codeblock을 착각했네요 

codeblock 에서는 안나와서요..

djm03178   4년 전

거기서도 잘 나옵니다.

preview

djm03178   4년 전

제가 가장 의심하는 것은 테스트를 해보실 때 T를 1로 놓지 않고 크게 놓고 99990 하나만 입력해봐서 프로그램이 종료되지 않은 상태를 보신 게 아닌가 하는 것입니다.

cin.tie(NULL);을 했기 때문에 cin이 호출되어도 cout이 flush되지 않으므로, 입력 대기 상태에서는 그 전에 출력한 내용이 화면에 보이지 않을 수도 있습니다. '\n' 대신 endl을 쓰면 flush가 발생하므로 (이러면 cin.tie(NULL)을 한 의미가 없지만) 바로 화면에 보입니다.

하지만 프로그램이 종료될 때는 cout이 마지막에 flush를 수행하면서 화면에 출력하므로 보이는 것이 맞습니다.

purpose   4년 전

preview

여러 컴파일러로 해주셔서 정말 감사합니다 덕분에 이 코드가 맞다는 것을 알게되었습니다!

그런데..ㅠㅠ

제 컴파일러는 1과 99990을 입력하면 잠깐의 시간이 흐른 후에 제대로 된 출력값이 나오지 않고

아무 값을 출력하지 않고 올바른 리턴값이 안나오고 종료되는데

혹시 왜그런걸까요..?

djm03178   4년 전

종료값이 올바르지 않다면 그걸 말씀해주셨어야 합니다...

dp가 99990부터 3까지 내려가면서 쌓인 재귀 스택이 너무 깊어서 스택 오버플로우로 터졌겠네요.

빌드 옵션에서 스택 크기를 키워서 해보시면 될 겁니다.

djm03178   4년 전

종료값이 올바르지 않다는 건 런타임 에러라는 것이고, 그러면 그건 출력이 되고 안 되고의 문제 이전에 먼저 해결을 해야 하는 문제입니다.

그리고 런타임 에러라는 건 환경에 따라서는 발생하지 않을 수도 있기 때문에 그 원인을 모른 채로 이 데이터에서 터진다고 바로 추가 요청을 올려서도 안 됩니다. 사실 다른 것도 마찬가지입니다. 틀렸습니다가 나와도 왜 틀린지를 모른 채로 추가 요청을 했는데 알고 보니 배열 범위를 벗어났기 때문이었다든가 하면, 채점 서버에도 이미 그 데이터가 들어있는데도 우연히도 채점 환경에서는 답을 잘 출력할 수도 있는 것이기 때문입니다.

purpose   4년 전

정말 감사합니다. 명쾌하게 해결이 되었습니다.

여러 번 답변을 해주셨는데 일단 번거롭게 해드려서 죄송하고..

답변 명쾌하게 해주셔서 정말 감사합니다!! 

공부하면서 물어볼데가 없어서 힘이 들때가 있는데

이렇게 답변을 정성껏 해주시니 너무 감사하네요..

덕분에 공부할 힘이 더 생깁니다 감사합니다 !!

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