kyun2024   4년 전

https://github.com/kingkk31/BOJ/blob/master/source%20code/4375_1.cpp

깃허브에서 받은 코드입니다.

이를 C++ 형태의 입력으로 고쳐서 제출했더니 틀리고 그냥 제출했더니 맞네요.

문제 자체를 파악하기가 어려워서 질문드립니다.

하단의 코드는 틀렸습니다를 받은 코드고 상단의 코드는 레퍼런스 코드입니다,.

dyk777   4년 전

43번 줄이 while문의 scope 밖에 있습니다.

입력의 문제는 전혀 없습니다.

kyun2024   4년 전

확인했습니다. 스코프 수정해서 제출해도 틀리네요. (당연하지만 실제로 헤더 부분을 지우고 돌리진 않았습니다)

dyk777   4년 전

참조한 코드에서는 solve()함수 내의 num이 unsigned long long int형으로 선언되어 있으나, 작성하신 코드에는 int로 되어 있습니다.

jh05013   4년 전

반드시 제출하신 코드를 그대로 올려주세요. 이건 헤더만 빠진 것이라서 쉽게 복구할 수 있지만, 전체 코드를 그대로 올려야 똑같은 환경에서 실행할 수 있습니다.

입력의 맨 끝에는 개행문자가 오기 때문에, 모든 테스트케이스가 끝나도 EOF가 되지 않아서 마지막 테스트케이스가 두 번 실행됩니다.

그리고 첫 번째 코드는 예제조차 안 돌아갑니다. 제출하기 전에 예제는 넣어보시는 것이 좋습니다.

kyun2024   4년 전

jh05013// 죄송합니다 너무 급하게 하다가 확인을 안하고 돌려봤네요.. 원본 소스에서 정확히 입력 파트만 바꾼 소스입니다.

unsigned long long int는 영향을 주지 않는 것 같습니다. (실제로 전체 범위에서 최대 길이도 4000이 조금 넘으니까요)

cpp.sh에서 text입력 모드로 확인해봤는데 아무런 문제가 없는 것 같습니다. 예상한대로 정확히 동작하네요.

kyun2024   4년 전

자문자답합니다. 아직 이해는 안되지만 C++ 버퍼 확인 순서의 문제였습니다.

아래는 해결된 소스입니다.

dyk777   4년 전

마지막에 작성하신 코드는 어떻게 나온 것인지는 아직 감이 잘 오진 않네요.


jh05013님의 지적에 따라, while문 및 그 내부의 코드들을 다음과 같이 고치면 되지 않을까 싶습니다.

unsigned long long을 빼도 된다는 얘기는 아닙니다.

예제에서도 알 수 있지만, 적어도 12자리의 수가 나온다는 말은 num의 값이 10^11이상이 되는 경우가 존재한다는 뜻이며, 이는 int의 범위를 넘어갑니다.

jh05013   4년 전

이미 답변드렸습니다. 입력의 맨 끝에는 개행문자가 오기 때문에, 모든 테스트케이스가 끝나도 EOF가 되지 않아서 마지막 테스트케이스가 두 번 실행됩니다.

jh05013   4년 전

@dyk777 매 루프마다 %n을 하고 있기 때문에 int를 넘어갈 일은 없습니다.

jh05013   4년 전

오해가 있을까봐 덧붙이자면 위의 EOF 얘기는 !cin.eof() 질문에 대한 답변입니다.

kyun2024   4년 전

@jh05013 감사합니다. 입력의 끝에 개행문자가 온다는게 문제에 나와있지 않는데 백준 시스템에서 eof를 검사하는 문제는 기본적으로 적용된다고 생각해도 될까요? 아니면 일반적인 경우에도 마찬가지 인가요? 예를 들면 "3\n5\n7"의 텍스트를 입력으로 준다고 생각 했을때는 7이후로 eof가 감지되어서 프로그램이 정상적으로 종료되어야 된다고 생각됩니다.

jh05013   4년 전

모든 문제의 데이터의 끝에는 개행 문자가 들어와야 한다는 것이 원칙입니다. 다만 오래된 문제일 경우 이 원칙이 지켜지지 않을 가능성도 있는데, 이때는 재채점 요청을 하면 승인됩니다.

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