1000daughter   3년 전

입력한 수인 n이 짝수인 경우와 홀수인 경우로 먼저 케이스를 나눈 뒤,

서있는 타일을 a, 누워있는 타일을 b로 놓아 가능한 경우의 수를 고려해 풀이했습니다.

1부터 81까지는 정답과 제 코드의 결과가 같은데(피보나치수열) n=82부터는 정답이랑 제 코드의 결과가 달라지네요...ㅜㅜ

풀이방식에는 문제가 없다고 생각하는데 그 이유가 뭔지 잘 모르겠습니다.

아마 수식 자체는 맞을텐데 실수 오차로 인해 틀렸을 것입니다. 일례로

int(math.factorial(1000) / math.factorial(950))를 보면 수학적으로는 저 값이 951 x 952 x ... x 1000 이니 딴건 몰라도 1의 자리가 0인건 확실한데 막상 출력해보면 287...168 이 됩니다. 정확한 내부 계산 매커니즘은 모르지만 Python 3의 / 은 실수를 반환하는 나눗셈 연산이라 정수를 나누더라도 그 정수를 실수로 변환하는 것 같습니다.

해결 방법은

1. / 을 // 으로 고쳐 연산 결과가 정수가 되게 한다.(이 방법으로 통과되는걸 확인했긴한데 n이 1000으로 그다지 크지 않아 가능한 풀이이지 n이 더 컸다면 math.factorial(x)을 계산하는 것 자체가 너무 무거운 연산이라 시간초과가 났을 가능성이 큽니다.)

2. fact[x] = x! 을 10007로 나눈 나머지라는 배열을 미리 만들어두고 정수의 역원등을 적절하게 이용해 모든 연산을 Z_10007 안에서 이루어지게 한다.

이 2가지가 있겠습니다.

1000daughter   3년 전

감사합니다. 실행결과를 매 loop마다 출력이 되도록 해서 검토해보았는데 역시 코드 구동 과정에서 실수 오차가 발생된게 누적되서 그런 것 같아요. 답변 다시 한 번 감사드립니다

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