반응형


교내 프로그래밍 대회에서 내가 출제한 문제 중 하나가 바로 후위 표기법(Postfix Notation) 을 계산하는 쉬운 문제였는데, 이 문제에서 양수와 음수 모두의 사칙연산을 처리해 줘야 하는 것이 함정이라서 생각보다 정답률이 높지는 않았다.




C. 후위 표기법


그런데 대회가 끝나고 나서, 이 문제에 대해 본인이 테스트 할 때는 제대로 답이 나오는데 Judge 는 오답이라고 판정하는 이유를 아무리 생각해도 모르겠다며 나를 찾아온 후배가 있었는데, 어떤 부분이 잘못 되었는지 토론하던 중에 이런 이야기가 있었다.

"문제의 기술에서는 음수의 나눗셈에서 몫만 계산한다고 할때 -10 / 3 = -3 이 아닌 -4 가 될 수 있는데, 이 부분이 ambiguous 하지 않은가??"

결론적으로, 오늘 claim 을 했던 후배의 소스코드를 검토한 결과 소스코드의 오류는 divide by zero 이후의 수식을 제대로 예외처리 하지 않은 문제였다. 그런데 음수의 나눗셈에 대한 문제는 나도 좀 애매해서 인터넷을 찾아보니 다음과 같은 명쾌한 설명이 있었다.

agile 이야기 :: 표면적 단순함과 심층적 단순함 : -5/4 는 얼마일까

저 글을 참고하면 결론적으로, "음수의 나눗셈은 프로그래밍 언어마다 다르게 구현된다" 가 정답이고, 실제로 수학자들 사이에서도 -10/3 = -3 인지 -10/3 = -4 인지는 논란이 되고 있으며, 일반적으로 어느 쪽으로 정의하느냐에 따라 해당 정리에 맞게 사용된다고 한다.
( C 나 C++, Java 에서는 -10 / 3 = -3 이 되고, Python, Ruby 에서는 -10 / 3 = -4 가 된다. )

다만, 이 프로그래밍 대회에서는 "사용 언어를 C 와 C++ 로 규정지었으므로, C 와 C++ 의 나눗셈연산 결과를 사용하는 것이 맞다" 라고 결론을 지었다.

그냥 지나칠 수 있는 이런 미묘한 부분까지 덕분에 새롭게 리뷰할 수 있어서, 나 자신에게도 좋은 공부가 되는 기회가 된 것 같다. =)  사실 이 문제의 샘플 인풋에서는 의도적으로 음수의 나눗셈을 표시하지 않았는데 이것을 샘플 인풋에서 오픈했더라면 이런 오해는 없지 않았을까 하는 생각도 든다. ;)

사용자 삽입 이미지
참고 ) Wikipedia 의 Integer Division 설명



'IT Story > Programming Language' 카테고리의 다른 글

fwrite 와 fprintf 의 차이점  (8) 2009.02.09
goto Statement Consider Harmful  (0) 2008.12.01
비트 이동 연산자 ( << , >> ) 의 결과  (0) 2008.10.24
C++ 과 C# 의 차이...  (4) 2008.07.13
int main() vs void main()  (12) 2007.09.30

+ Recent posts