https://www.acmicpc.net/board/... 글 잘 읽었습니다.
네이버 블로그 댓글을 타고 와서 본 글이긴 한데 지금 정말 공교롭게도 네이버 블로그가 정기 점검 중이라 답댓글을 달 수도 없고 추가로 제 이번 학기 공부 방식인 복습글 포스팅도 불가능하여 공부도 못 하고 있는 처지입니다. 그래서 그냥 여기에 제 짧은 소견 밝히도록 하겠습니다.
일단 이 테스트 케이스의 목적은 입실론을 허용하지 않고, 어떤 좌표가 소수인 지점에서 정확히 T인 시간에 만날 수 있는 경우를 제대로 판별하게 하기 위함이라고 이해했습니다.
그런데 사실, 프로그래밍 대회에 있어서 실수 오차 범위는 허용해주는 것이 맞다고 (저는) 생각합니다. 일단 컴퓨터가 절대 모든 실수를 정확히 표현할 수 없다는 것도 이미 유명한 사실이고, 그래서 잘 만들어진 실수와 연관성이 높은 문제들은 문제, 입력, 출력 조건에서 오차범위에 대한 어떤 조건을 제시합니다. 정답과의 차가 1e-6 이내면 정답이라거나, 문제에서 ~~~한 값이 1e-6 이내인 경우는 없다던가...
저도 이 문제를 풀면서 의아함을 느꼈던 것이, 두 번째 예제 케이스에서 x=10, x=5에 있던 학생은 정확히 T=2.5일 때 x=7.5 지점에만 만날 수 있습니다. 이것이 바로 끝점에서만 만나는 예시인데, 이 예제의 등장으로 인해 마지막 순간에 정확히 끝점에서만 만나는 경우도 제대로 처리해야 한다는 건 확실해졌고, 별다른 문제없이 이걸 대부분의 사람들이 처리한 이유는 하필 2.5나 7.5 모두 0.5의 배수이기 때문입니다. 0.5는 2^k 꼴의 수 중 하나이고, 일정 범위 안에서 실수 자료형이 정확히 표현할 수 있어서 문제가 생기지 않은 것으로 알고 있습니다. 어쨌거나 예제를 보면서 좀 '이래도 되나...?' 싶은 생각을 했고 좀 불안해하며 제출을 했는데 맞긴 맞았습니다만... 이후 따로 처리는 안 했습니다. 귀찮아서...
파싱을 하거나 하여 10000배를 하면 정확한 비교가 가능하다고 제시하셨지만, 이것으로도 끝은 아닙니다. 해당 글 마지막에 있는 소스 코드에
2 1000000000
0 1000000000
999813528 1000000000
그러나 문제가 또 있습니다. 저렇게 범위를 넘어가는 값을 넣지 않더라도,
2 32.1112
0 289
1 8
뭐 이렇게 해서 문제는 많지만 다 예외처리로 땜빵을 가하면 맞을 수는 있습니다. 하지만 이 케이스들이 말해주는 것은 신경쓸 게 한 두 가지가 아님이 확실하다는 점이라고 생각합니다. 문제가 점점 하드코딩이 요구되게 변질되고 있죠.
그래서... 저는 그냥 이 문제의 테스트 케이스를 추가한다기보다는, 차라리 기존의 테스트 케이스를 다듬어서 실수오차에 민감하지 않도록 바꾸는 것이 더 좋다고 생각합니다. 여기서부터는 개개인의 의견이 다를 수 있는데, 초심자 전용 문제들로 만든 셋이 본래 취지이니까(뭐? L번이?), 이미 대회는 끝났지만 문제가 초심자 전용이 전혀 아니게 바뀌어버리는 일은 살짝... 부자연스럽다고 저는 생각합니다.
부족한 글이었습니다. 감사합니다.
simm4256 7년 전 2
https://www.acmicpc.net/source...
정답 처리된 위 소스로 아래 테스트 케이스를 돌려보면
1번 테스트 케이스에서 0이 나오고, 2번 테스트 케이스에서는 1이 나옵니다.
https://www.acmicpc.net/source...
이 소스에서는 1번 TC가 1이 나오지만 2번 TC에선 0이 나오네요.
둘 다 1이 나와야 합니다.