매일 알고리즘을 1문제씩 푸는데 풀면서 이상한 오답이 나와 정답을 맞은 후 이유를 찾아보았다.
깃헙에 매일 알고리즘을 풀고 올리는데,
오늘은 짧게 정리할만한 오답이 나왔다.
프로그래머스 Lv2 피보나치 수의 관한 문제다.
피보나치 수를 계속 구한 후 1234567 로 나눈 나머지를 구한 문제인데
나는 처음에 결과를 return 할때 1234567 로 나머지를 구했다.
그 이유는 불필요한 연산을 줄이기 위해서였는데
값을 저장할때 1234567를 나누게 했더니 문제가 풀렸다.
데이터 처리 값을 넘어갔구나 짐작은 했다.
푼 이후 이유를 찾아 보았다.
처음 찾은 이유는 integer 값에 관한 글이 였다.
https://programmers.co.kr/questions/11991
물론 이는 C같은 언어에서는 맞는 말이지만 JS에서는 타입을 명시하지 않는다
(참고로 int 의 자료형은 -2,147,483,648 ~ 2,147,483,647까지 지원한다. 이는 word의 크기가 4byte라 가정하기 때문이며,
1 byte는 8bit, 고로 총 2^32개의 숫자를 지원한다)
더 찾아보니 JS가 보장하는 정수계산을 넘어간 이유였다.
MAX_SAFE_INTEGER 는 9007199254740991 이고 이를 넘어가서 오류가 난 것이다.
따라서 모듈러 연산의 (A + B) % C ≡ ( ( A % C ) + ( B % C) ) % C라는 성질을 이용해 풀 수 있었다
즉 오버플로우가 일어나서 오답이 나왔던 것이다.