mshrimp   6년 전

12792번 문제 "주작 주 주작" 문제는 특성상 값을 다 받지 않아도 출력이 가능한 문제입니다만, 입력값을 다 받지 않고 코드를 종료해버리면 런타임 에러가 납니다. 11720 문제에서도 이런 일이 발생했으나, 제 코드 문제일 것으로 생각하고 보류하고 있었는데 12792번 문제 같은 경우에는 코드의 문제일 가능성이 없어서

(define (lame a) (if (eof-object? (peek-char)) nil (lame (read))))

(lame 1)

이렇게 EOF가 나올때까지 무의미한 입력받기를 계속하는 코드를 집어넣어봤더니 정상 작동하였습니다. (채점번호는  8473844와 8473870입니다)

 이로서 입력값을 마저 받지 않은 것이 런타임 에러였던 것이 분명해져서 11720번 "숫자의 합" 문제에도 같은 코드를 집어넣어 재채점하였더니 또한 정상 작동하였습니다. (채점번호는 8473797과  8473903입니다)

12792번 문제의 경우 사용할 수도 있는 값이지만 사용하지 않은 값이 있었고, 11720번의 경우는 아마 데이터 마지막에 공백이 있을 것입니다.

지금처럼 나머지 값을 수동으로 처리하는 것도 가능하지만, 열람 불가능한 런타임 에러라 지금까지 코드 외의 문제인지 아무도 몰랐을 것이고, 나머지 쓰레기 값을 처리하는 데 시간이 소요되며,  SCM이 아닌 다른 Scheme 인터프리터/컴파일러에는 (clear-input-port)나 (discard-chars) 같이 나머지 입력을 버릴 수 있는 procedure가 이미 있다는 것을 생각할 때 이 방법은 합리적이진 않습니다.

 현재 백준에서 C 코드에서는 그런 문제가 발생하지 않는다고 가정할 때, scheme 코드를 C코드로 먼저 변환해서 GCC로 컴파일하는 Chicken Scheme 같이 기존 C/C++ 채점 코드에서도 제대로 동작하는 방법을 택하거나 (물론 기존 코드 재채점 시 procedure 차이로 런타임 에러가 나는 코드가 몇 개 생길 수 있습니다. ex: 1+, -1+), Ubuntu SCM에서 런타임 에러를 해결할 수 있는 다른 우회법을 적용해주셨으면 합니다.

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