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

JavaScript에서 문자열로 표현된 두 숫자를 변환 없이 더하는 방법

두 개의 숫자를 나타내는 문자열 str1str2를 인수로 받는 JavaScript 함수를 작성해야 합니다.

여기서 중요한 조건은 문자열 전체를 숫자(Number)로 변환하지 않고도 두 수의 합을 계산해야 한다는 점입니다. 최종 결과 역시 문자열 형태로 반환해야 합니다.

문제 예시

예를 들어, 다음과 같은 두 개의 문자열이 주어졌다고 가정해 보겠습니다.

const str1 = '234';
const str2 = '129';

이 경우 함수는 다음과 같은 결과를 반환해야 합니다.

363

접근 방식: 자릿수별 덧셈

사람이 손으로 덧셈을 하는 방식을 그대로 코드로 옮기면 됩니다. 즉, 가장 오른쪽 자리(1의 자리)부터 시작해 각 자릿수끼리 더하고, 합이 9를 넘으면 다음 자리로 올림수(carry)를 넘겨주는 방식입니다.

알고리즘의 동작 과정은 다음과 같습니다.

1. 두 문자열의 끝(마지막 자릿수)에서부터 탐색을 시작합니다.
2. 각 자릿수와 기존의 올림수를 모두 더합니다.
3. 합이 9보다 크면 올림수를 1로 설정하고, 현재 자리에는 합을 10으로 나눈 나머지를 기록합니다.
4. 두 문자열의 모든 자릿수를 처리할 때까지 반복하며, 마지막에 올림수가 남아 있으면 이것도 결과에 추가합니다.

구현 코드

위 알고리즘을 코드로 구현하면 다음과 같습니다.

const str1 = '234';
const str2 = '129';

const addStringNumbers = (str1, str2) => {
    let ind1 = str1.length - 1,
        ind2 = str2.length - 1,
        res = "",
        carry = 0;
    while(ind1 >= 0 || ind2 >= 0 || carry) {
        const val1 = str1[ind1] || 0;
        const val2 = str2[ind2] || 0;
        let sum = +val1 + +val2 + carry;
        carry = sum > 9 ? 1 : 0;
        res = sum % 10 + res;
        ind1--;
        ind2--;
    };
    return res;
};

console.log(addStringNumbers(str1, str2));

실행 결과

콘솔 출력 결과는 다음과 같습니다.

363

코드 설명

핵심 로직을 살펴보면 다음과 같습니다.

- ind1ind2는 각각 두 문자열의 마지막 인덱스부터 시작하는 포인터 역할을 합니다.
- str1[ind1] || 0 패턴은 한쪽 문자열의 자릿수가 먼저 소진된 경우에도 오류 없이 0으로 처리되도록 해줍니다.
- 단일 연산자 플러스(+val1)는 문자열 전체가 아닌 개별 자릿수 하나만 숫자로 변환하기 때문에, 문제의 조건인 "전체 변환 금지"를 위반하지 않습니다.
- carry 변수는 자릿수 합이 9를 초과했을 때 다음 자리로 넘어가는 올림수를 저장합니다.
- sum % 10 + res는 계산된 자릿수를 결과 문자열 앞에 붙여 올바른 순서로 결과를 만들어 줍니다.

이 방법은 문자열의 길이에 비례하는 O(n) 시간 복잡도를 가지며, Number 자료형이 표현할 수 있는 범위(약 2^53 − 1)를 넘어서는 매우 큰 숫자의 덧셈에도 안정적으로 동작한다는 장점이 있습니다.