[프로그래머스] 두 수의 합

LSA·3일 전
0

javascript+a

목록 보기
8/8
post-thumbnail

문제 링크

문제 설명

0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.

입출력 예

abresult
"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("");
}

이쯤되면 정성이 아닐까 싶다.

profile
진짜 간단하게 작성한 TIL 블로그

0개의 댓글

관련 채용 정보