ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [leetcode] 2번 Add Two Numbers / javascript
    leetcode 2022. 2. 1. 13:35

    문제 보기

    https://leetcode.com/problems/add-two-numbers/

     

    Add Two Numbers - LeetCode

    Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

    leetcode.com

     

    l1과 l2를 더해 새로운 리스트를 만드는 문제입니다.

     

    사실 문제 자체는 간단하지만 예시와 결과가 겉보기에 모두 배열로 되어있어 런타임 에러가 계속 발생했습니다.

     

    하지만 자세히 본다면 아래와 같은 정의를 볼 수 있습니다.

    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} l1
     * @param {ListNode} l2
     * @return {ListNode}
     */

    그렇습니다... 배열이 아니라 주어진 ListNode를 사용해야 합니다. 

     

     

    이외에는 단순히 주어진 조건에 맞게 구현을 하면 됩니다.

    var addTwoNumbers = function (l1, l2) {
      const node = new ListNode();
      let tmpNode = node;
      let carry = 0;
      while (l1 || l2 || carry) {
        const left = l1 ? l1.val : 0;
        const right = l2 ? l2.val : 0;
        let sum = left + right + carry;
        const value = sum < 10 ? sum : sum % 10;
        carry = sum < 10 ? 0 : 1;
        tmpNode.val = value;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        tmpNode.next = new ListNode();
        tmpNode = tmpNode.next;
      }
      return node;
    };

    하지만 이렇게 구현을 하면 한가지 문제가 발생하게 됩니다.

    현재는 node의 0번부터 계산을 하여 저장하고, 마지막 줄에 nextNode를 추가해줍니다.

    그렇다 보니 마지막 결과는 항상 0이 추가로 들어가게 됩니다.

    ex) 테스트케이스 [2,4,3] [5,6,4]를 실행하면 [7,0,8]가 나와야 하지만 [7,0,8,0]이 나오는 것이죠. while문이 멈추기 전에 nextNode를 한번 더 추가해주기 때문입니다.

     

    따라서 조건문을 통과하는 경우에만 nextNode를 만들어주겠습니다. 그렇게 된다면 현재 새로 만들어진 처음 node의 val은 0 이 되겠죠. 따라서 return을 할 때 node.next를 해줍니다.

     

    정답

    var addTwoNumbers = function (l1, l2) {
      const node = new ListNode();
      let tmpNode = node;
      let carry = 0;
      while (l1 || l2 || carry) {
        tmpNode.next = new ListNode();
        tmpNode = tmpNode.next;
        const left = l1 ? l1.val : 0;
        const right = l2 ? l2.val : 0;
        let sum = left + right + carry;
        const value = sum < 10 ? sum : sum % 10;
        carry = sum < 10 ? 0 : 1;
        tmpNode.val = value;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
      }
      return node.next;
    };

     

     

    사실, 문제 자체는 엄청 간단합니다만,,, 주어진 조건을 보다 꼼꼼히 보아야 삽질을 안 하는 문제인 것 같습니다:)

    댓글

Designed by Tistory.