코딩테스트/프로그래머스 기초 트레이닝

[Javascript] 두 수의 합

dev_swH 2023. 7. 13. 23:31

문제 설명 : 

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 공식 문서를 첨부한다.

https://gurtn.tistory.com/83

 

[JS] 아주 큰 숫자 한계 처리

문제점 자바스크립트의 기본 자료형의 수는 한계점이 존재합니다. Number.MAX_SAFE_INTEGER의 값보다 큰 값은 정확하지 않을 때가 많습니다. 해결방법 BigInt 타입의 값을 만들어 계산하는 방법으로 해

gurtn.tistory.com

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

 

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를 사용했더라.

그래.....그러면 되는 거네.....

오늘도 배워간다, 깔끔한 코드! 😆