Development Project

[ LeetCode - (06/26) ] - 2. Add Two Numbers(Python) 본문

CodingTest/LeetCode

[ LeetCode - (06/26) ] - 2. Add Two Numbers(Python)

나를 위한 시간 2022. 6. 26. 21:53
  • 문제링크

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

 

 

 

  • 문제

 

 

 

  • 시행착오

문제를 잘못읽어 처음에는 print를 이용해 리스트처럼 출력을 했지만, stdout에 출력값이 뜨고 output에 결과가 나오질 않아서 한동안 해매었다. 결론은 stdout은 표준출력으로 print()함수같은 출력을 말하며 output은 함수의 return값 같은 값을 일컫는 말이었다. 하지만 이걸 고친다고해서 오류는 사라지지않았다. 바로 문제를 잘못읽어 링크드리스트의 형태로 출력해야하는 문제였기 때문이다.. 그래서 오랜만에 링크드리스트의 문법을 되새기며 문제를 풀었고, 답에 도달할 수 있었다. 매번 문제를 제대로 못읽는게 느껴진다. 문제 읽는시간을 측정해가며 읽어보는 등의 노력을 해야겠다.

 

 

 

  • 문제분석

Optimal[ListNode] : 링크드리스트

두개를 인자로 받아 각 역순으로 가져온 값을 더하여 다시 역순으로 링크드리스트를 만들어 return하는 문제이다. 링크드리스트 클래스가 주어지지만, 이를 만들어볼 뿐만 아니라 노드를 더 연결하거나, 삭제, 전체출력하는 방법 등을 자유롭게 사용할 줄 알아야 이 문제가 쉽게 풀릴 수 있다.

 

 

 

  • 각 파라미터의 유형

Optimal[ListNode]  = [2,4,3]

<조건> 

→  빈 링크드리스트는 주어지지 않음

→  링크드리스트의 head(가장처음 헤더값)은 0으로 주어지지 않는다.

→  0 ≤ 링크드리스트의 value값  9

→  1  링크드리스트의 node개수  100

링크드리스트이며, 위의 조건을 충족한다.

 

 

 

  • 문제접근

※ 작성자가 문제를 보고 든 생각을 차례대로 써본 것이다. 이 순번은 정답이 아니며 매번 다른 생각을 해보길 권장한다.

 

1) 우선 링크드리스트를 역순으로 받아 저장해야한다고 생각했다. 링크드리스트는 단순 리스트가 아니므로, 현재 링크드리스트가 존재하면 value값을 문자열형식으로 누적시키고 다음 노드를 가리키도록 코딩했다.

totalA=""
while l1:
    totalA += str(l1.val)
    l1=l1.next

숫자로 할 경우 첫 숫자가 0이라면 제외가 되므로 문자열로 받는 것을 택했다.

 

2) 위의 방식으로 두 링크드리스트(l1, l2)를 문자열로 받은뒤에 역순으로 정렬하고 이를 계산한 값을 total에 담았다.

total=str(int(totalA[::-1])+int(totalB[::-1]))

 

3) total도 역순으로 출력해야하므로 링크드리스트를 만들때 head를 가장 마지막 원소로 잡고 이를 제외한 나머지로 반복문을 돌려 리스트를 완성했고 이를 리턴했다.

head = ListNode(total[-1])
cur_node = head
for i,n in enumerate(total[-2::-1]):
    new_node=ListNode(n)
    cur_node.next = new_node
    cur_node = cur_node.next
return head

enumerate는 사실 여기서는 안써도되지만, 오랜만에 사용해볼겸 써봤다. 만약 반복문안에서 인덱스값을 출력시켜야한다면 파이썬 다운 함수인 enumerate를 써보자

 

 

  • 최종코드
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        total="";totalA="";totalB=""
        while l1:
            totalA += str(l1.val)
            l1=l1.next
        while l2:
            totalB += str(l2.val)
            l2=l2.next
        total=str(int(totalA[::-1])+int(totalB[::-1]))
        head = ListNode(total[-1])
        cur_node = head
        for i,n in enumerate(total[-2::-1]):
            new_node=ListNode(n)
            cur_node.next = new_node
            cur_node = cur_node.next
        return head

'CodingTest > LeetCode' 카테고리의 다른 글

[ LeetCode - (06/24) ] - 1. Two Sum(Python)  (0) 2022.06.24
Comments