ETC/Algorithm

[LeetCode] Add Two Numbers (못풀었다)

Pazery는ENFJ 2021. 11. 30. 00:33
반응형

문제 출처 : 릿코드 (https://leetcode.com/problems/add-two-numbers/)

 

문제

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself.

 

두 개의 음이 아닌 정수를 나타내는 두 개의 비어 있지 않은 연결 목록 이 제공 됩니다. 숫자는 역순 으로 저장되며 각 노드에는 단일 숫자가 포함됩니다. 두 숫자를 더하고 합을 연결 목록으로 반환합니다.

숫자 0 자체를 제외하고 두 숫자에 선행 0이 포함되어 있지 않다고 가정할 수 있습니다.

 

예제

Input: l1 = [2,4,3], l2 = [5,6,4]

Output: [7,0,8]

Explanation: 342 + 465 = 807.

 

접근 방식

ListNode라는 returnType을 보고 LinkedList가 생각이 났다. (처음엔 문제 상단에 Definition을 보지 못해서 혼자 한참 고민)

단방향 LinkedList 일까(?) 나름 생각하고 문제를 풀이를 시작했다.

1. 각 리스트들의 사이즈가 다를 것이니 null 체크를 꼭 해야 한다.

2. 각 노드의 값을 더해서 10을 넘으면 다음 노드 값의 합에 1을 추가해야겠다.

     1) 자릿수가 넘어가는지 확인하기 위해 변수를 하나 써야겠다 (carry)

     2) 두 리스트의 합을 담은 변수는 다음 반복문에서 carry 값 과는 다르게 초기화를 해줘야 한다.

3. 마지막 노드 두 개의 합이 10을 넘으면 리스트 마지막에 1을 추가해야겠다.

 

나의 풀이 (실패)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode resultNode = new ListNode();
        ListNode tmpNode = resultNode;
        int sumResult = 0;
        int carry = 0;

        while(l1 != null || l2 != null) {
            if(l1 != null) {
                sumResult += l1.val;
                l1 = l1.next;
            }
            if(l2 != null) {
                sumResult += l2.val;
                l2 = l2.next;
            }

            if(sumResult > 9) {
                sumResult -= 10;
                if(carry == 1) {
                    tmpNode = new ListNode(sumResult + carry);
                } else {
                    tmpNode = new ListNode(sumResult);
                }
                carry = 1;
            }else {
                if(carry == 1) {
                    tmpNode = new ListNode(sumResult + carry);
                } else {
                    tmpNode = new ListNode(sumResult);
                }
                carry = 0;
            }
            sumResult = 0;

            tmpNode.next = tmpNode;
        }
        if(carry == 1) {
            tmpNode.next = new ListNode(1);
        }

        return resultNode.next;
    }
}

어.. 이렇게 풀면 첫 번째 노드들의 합이 10이 넘을 경우에는 carry 값이 누락되는데...  개미지옥에 빠져버렸다..

이래서 코딩부터 하지 않고 논리를 세우고 코딩을 해야 하는데 손부터 나가는 습관이 다시 도졌다 ㅠㅠ

시간이 너무 늦어서 그런지 머리가 안 돌아간다 (라는 핑계)

한 시간 정도를 씨름하다가 결국 풀이를 찾기 시작했다

다른 블로거 분의 풀이를 보고 다시 풀어본다 (정답)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode resultNode = new ListNode();
        ListNode tmpNode = resultNode;
        int sumResult = 0;
        
        while(l1 != null || l2 != null) {
            sumResult = sumResult / 10;
        	if(l1 != null) {
        		sumResult += l1.val;
        		l1 = l1.next;
        	}
        	if(l2 != null) {
        		sumResult += l2.val;
        		l2 = l2.next;
        	}
        	
            tmpNode.next = new ListNode(sumResult % 10);
            tmpNode = tmpNode.next;
        }
        
        if(sumResult / 10 == 1){
            tmpNode.next = new ListNode(1);
        }
        
        return resultNode.next;
    }
}

풀이 출처 : https://madplay.github.io/post/leetcode-2-add-two-numbers

기가 막힌다.. 답을 보니까 단순하다고 생각이 드는데..

내일 다시 생각해봐야겠다!

반응형

'ETC > Algorithm' 카테고리의 다른 글

[LeetCode] 53. Maximum Subarray  (0) 2021.12.30
[LeetCode] 238. Product of Array Except Self  (0) 2021.12.14
[Leetcode] Contains Duplicate  (1) 2021.12.09
[LeetCode] problem 1. Two Sum (Using HashMap)  (0) 2021.11.25
[LeetCode] problem 1. Two Sum  (0) 2021.11.23