문제 설명
0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.
입출력 예
a b result "582" "734" "1316" "18446744073709551615" "287346502836570928366" "305793246910280479981" "0" "0" "0"
String
타입으로 들어온 숫자를 Number
타입으로 변환하여, 더하기 연산을 한 결과물을 String
타입으로 다시 변환하라는 이야기다.
여기까지만 보면 쉬워 보이나 복병이 숨어 있다.
2번째 예시 같은 "짱 큰 숫자"(무려 한글로 변환하면 천팔백사십사경 육천칠백사십사조 칠백삼십칠억 구백오십오만 천육백십오
가 된다)까지 계산을 해야한다는 것.
18446744073709551615
를 단순하게 Number()
로 타입 변환을 시키면, 18446744073709552000
로 뒷자리 일부분이 0으로 바뀌어버린다.
결론: 짱 큰 숫자까지 처리할 수 있는 타입 변환 함수를 만들어야 한다.
function solution(a, b) {
return `${BigInt(a) + BigInt(b)}`;
}
이 문제를 풀기 전까지 나는 BigInt()
라는 메서드의 존재를 모르고 살았다.
BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
-출처: MDN
그래서 단순한 문제임에도 불구하고 지식인들의 힘을 빌렸다.
물론 똑똑한 사람들 중에서, BigInt
함수를 사용하지 않고 반복문으로 문제를 해결한 사람도 있었다.
function solution(a, b) {
a = [...a];
b = [...b];
let answer = [];
let next = 0;
while(a.length && b.length) {
let _a = +a.pop();
let _b = +b.pop();
let sum = _a + _b + next;
if(sum >= 10) {
sum -= 10;
next = 1;
} else
next = 0;
answer.push(sum);
}
let rest = a.length ? a : b;
while(rest.length) {
let sum = +rest.pop() + next;
if(sum >= 10) {
sum -= 10;
next = 1;
} else
next = 0;
answer.push(sum);
}
if(next)
answer.push(next);
return answer.reverse().join("");
}
이쯤되면 정성이 아닐까 싶다.