Add_Two_Numbers(LeetCode)

김인회·2021년 9월 30일
0

알고리즘

목록 보기
45/53

(출처) https://leetcode.com/problems/add-two-numbers/

로직자체는 어렵지 않은데..

문제 자체는 어려워 보이지 않았다.

입력으로 들어온 수들을 알맞게 더하고 자리수 옮김만 조심해서 리턴해주면 되니까 쉽게 풀 수 있어 보였다.

그런데 막상 로직을 구현해 보려고 하니 포인터를 직접 조작하면서 계산하는 것부터 머리가 복잡해지고 코드를 짜내려 가는 게 마냥 쉽지만은 않았다.

뭐 결국 어찌어찌 짜내서 정답을 받긴 했지만 코드도 복잡하고, 또 복잡해진 만큼 표현도 명확하지 않고.. 코드를 짜는 시간 자체도 오래 걸렸고 솔브 했어도 굉장히 찝찝함이 많이 남은 문제였다.

한번 다른 사람들이 올린 코드를 찾아보았더니 정말 간결하더라. 또 내용도 명확하고.

이렇게 뭔가 간단히 핵심만 남겨놓은 코드들을 막상 봤을 때는 아니 이 정도는 나도 쉽게 할 수 있을 것 같은데? 어렵지 않은데? 하다가도 막상 직접 코드를 쓰다 보면 왜 나는 코드를 저런 식으로 못 짜는 거지하면서 금세 내 수준을 깨닫게 된다..

아무튼 Good Solution으로 올라온 다른 분의 풀이를 읽어봤는데 배울 점이 많은 것 같아서 좀 남겨놓고 둬놨다 보고 싶어서 글을 올린다.

내 코드


#include <iostream>

using namespace std;

struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        bool digit = false;
        bool l1_flag = false, l2_flag = false, flag = false;
        ListNode* first = new ListNode(0);
        ListNode* list = first;
        while(!(l1_flag && l2_flag && !digit)) {
            int a = 0, b = 0;
            if(l1_flag) a = 0;
            else a = l1->val;
            if(l2_flag) b = 0;
            else b = l2->val;
            int addTwo = a + b;
            if(digit) {
                addTwo++;
                digit = false;
            }
            if (addTwo >= 10) {
                addTwo %= 10;
                digit = true;
            }
            list->val = addTwo;

            if(l1->next == nullptr) l1_flag = true;
            if(l2->next == nullptr)  l2_flag = true;

            if(!l1_flag) l1 = l1->next;
            if(!l2_flag) l2 = l2->next;
            if (!(l1_flag && l2_flag && !digit) ) {
                ListNode * temp = new ListNode();
                list->next = temp;
                list = list->next;
            }
        }
        return first;
    }
};

int main() {
    ListNode a = ListNode(9);
    ListNode b = ListNode(9, &a);
    ListNode c = ListNode(9, &b);
    ListNode a2 = ListNode(9);
    ListNode b2 = ListNode(9, &a2);
    ListNode c2 = ListNode(9, &b2);
    ListNode d2 = ListNode(9, &c2);

    Solution solution;
    ListNode *result = solution.addTwoNumbers(&c,&d2);

    while(result != NULL) {
        cout << result->val << " ";
        result = result->next;
    }
}

다른분 코드

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int sum=0;
        ListNode *l3=NULL;
        ListNode **node=&l3;
        while(l1!=NULL||l2!=NULL||sum>0)
        {
            if(l1!=NULL)
            {
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=NULL)
            {
                sum+=l2->val;
                l2=l2->next;
            }
            (*node)=new ListNode(sum%10);
            sum/=10;
            node=&((*node)->next);
        }        
        return l3;
    }
};
profile
안녕하세요. 잘부탁드립니다.

0개의 댓글