jh05013   6년 전

"BOJ 입문자들의 90%는 자신의 코드가 맞다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다."

잘 돌아가는데 틀리는 건 없습니다.

0. 예제도 안 나온다면

테스트케이스마다 합/개수/배열 초기화를 했는지, 부등호를 제대로 썼는지 확인해 보세요.

1. 테스트케이스의 개수

예제 입력에 있는 5개의 테스트케이스를 별개로 처리하는 게 아닙니다. 테스트케이스의 개수 C를 입력받고, C개의 테스트케이스를 한 번의 실행으로 모두 처리해야 합니다.

테스트케이스의 개수가 주어져 있지 않은데, 이 때는 테스트케이스의 개수에 대해 어떤 가정도 하면 안 됩니다. 최대 1000개일 수도 있고 100만 개일 수도 있습니다.

그러면 케이스를 다 저장해 놓을 수가 없는데 어떻게 풀어야 할까요? 그냥 케이스를 받을 때마다 출력하면 됩니다. 입력을 다 받고 그 다음에 다 출력할 필요가 없습니다. 입력하고 출력하고 입력하고 출력해도 됩니다. 입력과 출력이 섞여 나오는 건 화면에 그렇게 나오는 것뿐이지, 실제로는 분리되어 있습니다.

2. 출력 형식

단순히 값이 같아야 되는 게 아니라, 출력이 같아야 합니다. 특수문자와 띄어쓰기도 맞춰야 합니다. 그러니까 40.000%를 출력해야 하는데 40%, 40.0%, 40.000, 40.000 % 등을 출력하면 오답입니다. 사실 다르게 출력해도 통과되는 문제도 있는데, "스페셜 저지" 표시가 붙어 있고 "~~ 이하의 오차를 허용한다." 같은 말이 나오면 그렇습니다. 이 문제는 정확하게 출력해야 되는 문제입니다.

물론 불필요한 걸 출력해도 안됩니다. 정말 한 글자도 다르지 않고 그대로 출력되는지 확인해 보세요.

3. 평균과 퍼센티지 계산할 때 오차

실수형 연산은 언제든지 오차가 날 수 있으니 가급적 실수형 연산을 적게 해 보세요. 이 문제는 실수형 연산 없이 풀 수도 있습니다. (무조건 사용하지 말아야 된다는 뜻은 아닙니다.)

특히 가장 문제가 되는 경우는 (점수 / N)을 N번 더해서 평균을 계산하는 경우입니다. 예를 들어 1점이 7개 있다고 해 봅시다. 물론 이 경우의 평균인 1 자체는 실수형으로 정확하게 나타낼 수 있습니다. 하지만 1/7은 그렇지 않기 때문에 아주 미세하게 반올림이 됩니다. 그걸 7번 더했다간 평균이 0.9999999999999998으로 계산되고, 100.00%를 답으로 출력하는 재앙이 발생할 수 있습니다!

또한 C/C++의 경우, float은 유의미한 사용이 불가능할 정도로 부정확합니다. double을 쓰는 것이 항상 옳습니다.

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