[ Leetcode ] 2. Add two numbers

Lutica_·2024년 6월 20일
0

Solve-Leetcode

목록 보기
1/2

배너

풀어보기 : https://leetcode.com/problems/add-two-numbers/

문제

  • 두개의 숫자가 10의 단위 수로 나누어 보관한 연결리스트로 주어진다.
  • 이때, 연결리스트는 숫자 순서가 역순으로 보관되어있다.

실질적인 문제

  • 주어진 두 연결리스트의 합을 가진 연결리스트를 return하는 함수를 작성하라.
  • 단, 10을 초과하는 경우 다음 노드에 그 캐리를 더해야 한다.

풀이방안

  • 일단 두 노드를 포인터로 잡고, 계속 전진하면서 두 수를 더한다.

    이때, 캐리발생시 전파해주는 매개변수로 전파를 해준다!

  • 이후 한 리스트라도 None를 만나면 그 노드부터는 0으로 취급하거나 무시한다.
  • 그리고 맨 마지막에 캐리가 남는다면, 그 캐리를 맨 끝에 삽입한다.

1차 풀이

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        nowl1 = l1
        nowl2 = l2
        rt = ListNode()
        rtn = rt
        plus = 0
        while nowl1 is not None and nowl2 is not None :
            sumval = nowl1.val + nowl2.val + plus
            if sumval > 9 :
                plus = 1
                sumval = sumval - 10
            else :
                plus = 0
            rtn.val = sumval

            nowl1 = nowl1.next
            nowl2 = nowl2.next
            if nowl1 is None or nowl2 is None :
                break
            rtn2 = ListNode(0)
            rtn.next = rtn2
            rtn = rtn2
        
        if nowl1 is not None or nowl2 is not None :
            not_lost = None
            if nowl1 is None :
                not_lost = nowl2
            else :
                not_lost = nowl1
            while not_lost is not None :
                sums = not_lost.val + plus
                if sums > 9 :
                    plus = 1
                    sums = sums - 10
                else :
                    plus = 0
                new_node = ListNode(sums)
                rtn.next = new_node
                rtn = new_node
                not_lost = not_lost.next
        if plus != 0 :
            rtn.next = ListNode(1)

        return rt
  • 그런데 이 코드, 직관적이기는 하겠지만 깔끔하지는 않았다.
  • 왜냐하면, 한번에 검사를 마칠 수 있는 코드를 두번에 걸쳐 루프를 돌리게 했기 때문에, 코드의 길이가 너무 길어지고 의미도 살짝 부정확하다.
  • solution을 보고 살짝 고쳐봤는데 그 결과는 아래와 같다.

refactoring한 풀이

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        nowl1 = l1
        nowl2 = l2
        rt = ListNode()
        rtn = rt
        plus = 0
        while nowl1 or nowl2 :
            sumval = (nowl1.val if nowl1 else 0 )+ (nowl2.val if nowl2 else 0) + plus
            plus = sumval // 10
            sumval = sumval % 10
            rtn.val = sumval

            if nowl1 :
                nowl1 = nowl1.next
            if nowl2 :
                nowl2 = nowl2.next
            if nowl1 is None and nowl2 is None :
                break
            rtn2 = ListNode(0)
            rtn.next = rtn2
            rtn = rtn2


        if plus != 0 :
            rtn.next = ListNode(1)

        return rt
  • None 검사를 한 루프안에서만 돌리게 하여 더 적은량의 코드로 검사를 할 수 있었다.

교훈

  • 크게 어렵지는 않은 문제였다.
  • 하지만 연결리스트의 제어자를 다루는 일을 리팩터링하면서 좀 더 간소화된 방법을 깨닫게 해볼 수 있어서 의미는 있었다고 생각한다.

여담

  • 최근 알고리즘 연습 사이트를 프로그래머스에서 리트코드로 바꾸고 있는데 나름 할만한 듯 하다.
  • 백준은 인터페이스 문제로 개인적으로 적응을 못 하겠어서, 그냥 leetcode로 가는게 맞는 것 같다.
profile
해보고 싶고, 하고 싶은 걸 하는 사람

0개의 댓글