본문 바로가기
python

[PYTHON] Listnode 생성, 추가, 조작 (leetnode: Add Two Numbers)

디지털노마드 2021. 4. 5.
반응형

문제

 

2개의 비어있지 않은, 음수가 없는 listnode 를 받게 된다. 이것은 반대순서로 숫자가 저장되어 있으며 한 node 당 1개의 숫자가 들어 있다. 2개의 listnode 의 숫자를 제대로 배열해서 더한다음 다시 반대순서로 listnode 를 만들어서 return 하라.

 

예시

 

2 > 4 > 3, 5 > 6 > 4 의 listnode 가 주어진다면 두가지 listnode 에서 말하는 수는 342 와 465 이다. 이를 더하면 807이 되고 return 으로는 7 > 0 > 8 의 listnode 를 보내주면 된다. 

 

풀이

 

의식의 흐름대로 문제를 푼다. 2 > 4 > 3의 listnode (l1) 를 일단 [2, 4, 3] 의 list (firstNum) 로 만들어준다. 그리고 뒤에서부터 순서대로 하나씩 꺼내서 다시 [3, 4, 2] 의 list (revFirstNum) 로 만들어준다. 그 다음에 처음부터 숫자를 하나씩 꺼내어 3 * ( 10 ^ (리스트길이 - 1)) 으로 하나씩 꺼내서 더해준다. 그러면 300 + 40 + 2 = 342로 int (numRevFirstNum) 으로 저장한다. 

 

이런식으로 l2 도 진행하면 465로 저장이 되고 둘을 더하면 807(calcNum) 이 된다. 이를 다시 list로 만들고 다시 뒤에서부터 하나씩 꺼내어 listnode 로 만들어서 return 한다. 

 

이때 return 할 listnode (l3) 을 만들때 시작 pointer 를 2개 (l3, head) 만들어서 하나는 뒤로 넘어가면서 값을 저장하고, 다른 하나는 return 할때 쓴다. 

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        
        firstNum = []
        secondNum = []
        revFirstNum = []
        revSecondNum = []
        numRevFirstNum = 0
        numRevSecondNum = 0

        exit = 0

        while(exit != 1):
            firstNum.append(l1.val)
            if l1.next == None:
                exit = 1
            else:
                l1 = l1.next

        exit = 0

        while(exit != 1):
            secondNum.append(l2.val)
            if l2.next == None:
                exit = 1
            else:
                l2 = l2.next
            
        for i in range(len(firstNum) - 1, -1, -1):
            revFirstNum.append(firstNum[i])

        for i in range(len(secondNum) - 1, -1, -1):
            revSecondNum.append(secondNum[i])

        for i in range(len(revFirstNum)):
            numRevFirstNum += revFirstNum[i] * (10 ** (len(revFirstNum) - (1 + i)))

        for i in range(len(revSecondNum)):
            numRevSecondNum += revSecondNum[i] * (10 ** (len(revSecondNum) - (1 + i)))

        calcNum = numRevFirstNum + numRevSecondNum

        strCalcNum = str(calcNum)

        l3 = ListNode(strCalcNum[len(strCalcNum) -1])
        head = l3

        for i in range(len(strCalcNum) -2, -1, -1):
            l3.next = ListNode(strCalcNum[i])
            l3 = l3.next

        return head

 

 

아직 사람들이올려놓은 것 만큼 간단한 코드는 아니지만, 나중에 좀더 최적화 해보기로 한다. 이문제를 통해 list 와 listnode 를 조금더 자유롭게 다룰수 있게 되었다. 

 

 

반응형

댓글