Linked List 덧셈

Written by 코드팩토리 JC

1월 15, 2024

알고리즘

오늘은 Linked List 덧셈 문제를 풀어보는 시간을 가져보도록 하겠습니다.

Linked List란?

Linked List는 List를 구현하는 방법 중 하나입니다. Linked List 안의 각각 값을 Node라고 부를 때, 각 Node는 자신의 값 그리고 다음 값에 대한 레퍼런스를 가지고 있습니다. 그러므로 시작 Node부터 다음 값에 대한 레퍼런스를 쭉 타고 올라가면 전체 List가 완성이 되는 형식입니다. 예를 들어 Javascript로 구현한 간단한 Linked List는 아래와 같습니다.

// Linked List를 생성하는 함수
let ListNode = function (val, next) {
    this.val = val;
    this.next = next;
};

function example() {
    const linkedList =
        new ListNode(1,
            new ListNode(3,
                new ListNode(5,
                    new ListNode(7, null))));

    // node1
    console.log(linkedList.val);  // 1
    // node2
    console.log(linkedList.next.val);  // 3 
    // node3
    console.log(linkedList.next.next.val);  // 5
    // node4
    console.log(linkedList.next.next.next.val);  // 7
}

example();
JavaScript

문제

이번 문제는 Linked List 두 개를 더하여 결괏값을 Linked List로 리턴해주는 문제입니다. n 자리 숫자를 거꾸로 된 Linked List로 구현했을 때 (365 = 5-> 6 -> 3) 두 Linked List의 덧셈 값을 똑같은 거꾸로 된 Linked List로 리턴을 해주는 문제입니다. 조건은 숫자가 0일 때를 제외하면 0부터 시작하는 숫자는 존재하지 않습니다.

이 문제를 푸실 때는 세 가지를 주의하시면 될 것 같습니다. 첫 번째로 숫자가 0일 때를 주의하셔야 하고 두 번째로 두 개의 Linked List의 길이가 다를 때를 주의하셔야 합니다. 마지막으로 Linked List의 각 Node를 더했을 때 x > 10일 경우 올림을 하고 x -10을 해주셔야 한다는 걸 유의하시면 쉽게 푸실 수 있는 문제입니다.

풀이

Javascript로 풀이를 해보도록 하겠습니다.

// Linked List Node를 생성하는 함수
let ListNode = function (val, next) {
    this.val = val;
    this.next = next;
};

const addTwoNumbers = function (l1, l2) {
    let curL1 = l1;
    let curL2 = l2;
    // 첫번째 Node
    let original;
    // 제작중인 LinkedList의 현재 Node 값을 들고있을 변수
    let curNode;
    // 올림 적용여부 (raise === true 일경우 +1)
    let raise = false;

    while (curL1 || curL2) {
        // Node의 null 값을 감안해서 만일 null 이면 0을 더해줍니다.
        let l1Val = curL1 && curL1.val ? curL1.val : 0;
        let l2Val = curL2 && curL2.val ? curL2.val : 0;

        let addition = l1Val + l2Val;

        // 전 계선에서 올림값이 있었으면 1을 더해줍니다.
        if (raise) {
            addition += 1;
            raise = false;
        }

        // 만일 덧셈 값이 9보다크면 올림설정을 해주고 Node 값에서 10을 빼줍니다.
        if (addition > 9) {
            raise = true;
            addition -= 10;
        }

        // 첫 노드일경우 original에 저장해둡니다.
        if (!original) {

            original = new ListNode(addition, null);
            curNode = original;

        } else {
            // 첫 Node가 아닐경우 새로운 Node를 생성하고 이전 Node의 next 값에 저장해줍니다
            // 추가적으로 현재 Node를 새로운 Node로 지정해줍니다.
            const newNode = new ListNode(addition, null);

            curNode.next = newNode;

            curNode = newNode;
        }

        // 각 Linked List의 현재 Node를 next 값으로 변경해주는 작업입니다.
        curL1 = curL1 && curL1.next ? curL1.next : null;
        curL2 = curL2 && curL2.next ? curL2.next : null;
    }

    // 두 Linked List의 길이를 넘는 올림값이 있을경우 새로운 노드를 붙여줍니다.
    if (raise) {
        curNode.next = new ListNode(1, null);
    }

    return original;
};
JavaScript

위 코드는 제 방식대로 푼 것이고 조금 더 깔끔한 해설은 아래 링크를 가시면 볼 수 있습니다.

LeetCode

관련 포스트

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

서론 불변 프로그래밍: 현대 개발의 핵심 현대 소프트웨어 개발에서 불변 프로그래밍(Immutable Programming)의 중요성은 간과할 수 없는 요소입니다. 플러터(Flutter)에서도 마찬가지로 불변 프로그래밍 개념이 매우 중요하며, copyWith 함수는 이러한 불변성을 유지하는 데 핵심적인 역할을 합니다. 이 글에서는 플러터를 배우기 시작하는 개발자들에게 불변 프로그래밍의 중요성을 강조하고, copyWith 함수의 역할과 사용 방법에 대해 설명 해보겠습니다!...

ChatGPT가 이야기하는 2024년 개발자 로드맵

ChatGPT가 이야기하는 2024년 개발자 로드맵

서론 개발자의 여정을 시작하며 안녕하세요, 미래의 개발자 여러분! 오늘부터 시작하는 여러분의 개발 여정에 함께할 수 있어서 기쁩니다. 2023년은 기술이 매우 빠르게 변화하는 해였으며, 이러한 변화 속에서 개발자가 되기 위한 길은 더욱 다채롭고 흥미로워졌습니다. 이 로드맵은 초보자인 여러분이 개발의 세계에 첫발을 내딛는 데 필요한 기초부터 시작해, 점차 심화 단계로 나아가는 길을 안내해 드릴 것입니다. 백엔드 개발 이 글은 단순히 기술을 배우는 것 이상의 의미를 가집니다....

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

https://youtu.be/i5p6wXLAX7I 서론 Flutter 는 Code Generation 기능이 상당히 많이 활성화되어 있어요. 흔히들 많이 사용하는 json_serializable 라이브러리도 있고 retrofit 및 chopper 라이브러리도 있습니다. 오늘 알려드릴 freezed 또한 데이터 클래스에 편의 기능들을 제공해주는 code generation 라이브러리입니다. Freezed vs Json Serializable Code Generation 이라는...