문제 설명 :
0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.
뭐지~! 너무 쉬운데 정답률이 왜 낮은 거지~! 하면서 풀었으나
그러면 그렇지 테스트 케이스 2번이 이 문제의 핵심이었다.
- 예제 2번의 a, b는 각각 18446744073709551615, 287346502836570928366이고 18446744073709551615 + 287346502836570928366 = 305793246910280479981입니다. 따라서 "305793246910280479981"을 return 합니다.
그냥 덧셈을 시키면 305793246910280479981이 안 나오고 305793246910280500000이 반환되었다.
'긴 숫자 문자열 자리수' 이런 키워드로 구글링을 한 결과,
원인은 기본 자료형 Number 객체가 표현할 수 있는 숫자에 한계가 존재하기 때문이었다.
표현할 수 있는 최대 크기를 벗어나면 제대로 산수를 처리하지 못한다.
그래서 내가 사용할 자료가 안전한 크기의 정수인지 확인할 수 있는 속성이 바로 Number.MAX_SAFE_INTEGER다.
그리고 BigInt는 Number보다 큰 정수를 표현할 수 있는 자바스크립트 내장 객체다.
참고로 BigInt는 해당 객체끼리만 산수가 가능하다는 특징이 있다.
잘 정리해놓은 포스트와 MDN 공식 문서를 첨부한다.
[JS] 아주 큰 숫자 한계 처리
문제점 자바스크립트의 기본 자료형의 수는 한계점이 존재합니다. Number.MAX_SAFE_INTEGER의 값보다 큰 값은 정확하지 않을 때가 많습니다. 해결방법 BigInt 타입의 값을 만들어 계산하는 방법으로 해
gurtn.tistory.com
Number.MAX_SAFE_INTEGER - JavaScript | MDN
Number.MAX_SAFE_INTEGER 상수는 JavaScript에서 안전한 최대 정수값을 나타냅니다. (2^53 - 1).
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
BigInt - JavaScript | MDN
BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
developer.mozilla.org
이 개념들을 사용해 작성한 나의 풀이 :
function solution(a, b) {
if (+a > Number.MAX_SAFE_INTEGER || +b > Number.MAX_SAFE_INTEGER) {
return (BigInt(a) + BigInt(b)).toString();
} else {
return ""+(+a+(+b));
}
}
그런데 채점하면서 보니까 생각보다 연산 시간이 많이 걸려서 의아했는데
다른 사람들의 풀이를 보니까 조건문을 안 걸고
그냥 모든 케이스에 BigInt를 사용했더라.
그래.....그러면 되는 거네.....
오늘도 배워간다, 깔끔한 코드! 😆
'코딩테스트 > 프로그래머스 기초 트레이닝' 카테고리의 다른 글
[Javascript] 문자 개수 세기, 배열 만들기 4 (0) | 2023.07.13 |
---|---|
[Javascript] 조건에 맞게 수열 변환하기 2 (0) | 2023.07.08 |
[Javascript] 1로 만들기 (+답변 추가) (0) | 2023.06.28 |
[Javascript] 세로 읽기 (0) | 2023.06.27 |
[Javascript] 수열과 구간 쿼리 3 (0) | 2023.06.27 |
[Javascript] 날짜 비교하기 (0) | 2023.06.23 |
[Javascript] 특이한 이차원 배열 1 (0) | 2023.06.13 |
[Javascript] 특이한 이차원 배열 2 - every() (0) | 2023.06.13 |