Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 변환 라이브러리 없이 숫자 문자열 덧셈 구현하기

문제 이해하기

두 개의 숫자로 이루어진 문자열을 인자로 받아, 실제로 숫자 타입으로 변환하거나 변환 관련 라이브러리 메서드를 사용하지 않고 두 수의 합을 구하는 JavaScript 함수를 작성해야 합니다.

예를 들어 입력 문자열이 다음과 같다면 −

const str1 = '123';
const str2 = '456';

출력 결과는 다음과 같아야 합니다 −

const output = '579';

접근 방법

이 문제는 우리가 종이에 손으로 두 수를 더할 때와 동일한 방식으로 해결할 수 있습니다. 즉, 가장 오른쪽 자릿수(일의 자리)부터 시작하여 한 자리씩 차례대로 더하고, 합이 9를 넘으면 올림수(carry)를 다음 자릿수 계산에 반영하는 것입니다.

핵심 단계는 다음과 같습니다.

  • 두 문자열 중 길이가 더 긴 쪽을 기준 배열로 삼습니다.
  • 뒤에서부터 앞으로 이동하며 각 자릿수를 하나씩 더합니다.
  • 합이 10 이상이면 일의 자리만 남기고 올림수를 1로 설정합니다.
  • 모든 자릿수를 처리한 후, 마지막에 올림수가 남아 있으면 맨 앞에 '1'을 붙여 반환합니다.

구현 코드

위 접근 방식을 코드로 구현하면 다음과 같습니다 −

const str1 = '123';
const str2 = '456';
const addStrings = (num1, num2) => {
    // num1이 num2보다 짧지 않도록 순서를 정렬
    if (num1.length < num2.length) {
        let tmp = num2;
        num2 = num1;
        num1 = tmp;
    }
    let n1 = num1.length;
    let n2 = num2.length;
    let arr = num1.split('');
    let carry = 0;
    let total;
    for (let i = n1 − 1, j = n2 − 1; i >= 0; i−−, j−−) {
        let term2 = carry + (j >= 0 ? parseInt(num2[j]) : 0);
        if (term2) {
            total = parseInt(num1[i]) + term2;
            if (total > 9) {
                arr[i] = (total − 10).toString();
                carry = 1;
            } else {
                arr[i] = total.toString();
                carry = 0;
                if (j < 0) {
                    break;
                }
            }
        }
    }
    return (total > 9 ? '1' + arr.join('') : arr.join(''));
};
console.log(addStrings(str1, str2));

코드 설명

먼저 두 문자열의 길이를 비교하여, 항상 더 긴 문자열이 num1이 되도록 순서를 조정합니다. 그런 다음 긴 문자열을 문자 배열로 분리하여 각 자릿값을 제자리에서 수정할 수 있게 준비합니다.

반복문은 두 문자열의 끝자리부터 시작해 왼쪽으로 이동하며 진행됩니다. 매 단계마다 현재 올림수와 짧은 문자열의 해당 자릿값(범위를 벗어나면 0)을 더하고, 여기에 긴 문자열의 자릿값을 더해 총합을 구합니다. 총합이 9보다 크면 일의 자리 값만 배열에 저장하고 올림수를 1로 유지하며, 그렇지 않으면 올림수를 0으로 초기화합니다.

짧은 문자열의 모든 자릿수를 소진한 후에는 남은 자릿수에 올림수가 발생하지 않는 한 더 이상 계산할 필요가 없으므로 반복문을 종료합니다. 마지막으로 최종 합계가 9보다 컸다면 최상위 자리에서 올림이 발생한 것이므로 결과 문자열 앞에 '1'을 붙여 반환합니다.

출력

콘솔에 출력되는 결과는 다음과 같습니다 −

579