대부분의 사람들이 그렇겠지만, 개인적으로 굉장히 어려워하는게 Node인데 하필이면 2번부터 Node가 나왔다ㅋㅋㅋ 번호 순서대로 풀지 말아야겠다는 생각이 강력하게 들었지만 의외로 또 문제가 쉬워보여서 도전해봤다. 어렵진 않았지만 Node의 개념을 모른다면 절대 못푸는 그런 문제... return값도 node라는게 아주 키포인트임!


# 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, l2):
# print(l1.next.next) # ListNode{val: 3, next: None}
# ListNode는 길이가 없다. 생각해보면 당연하지만 일단 len충인 나는 해봤다 봉변당함ㅋㅋ
# print(len(l1)) # 'ListNode' has no len()
result = 0
i = 0
# 우선 l1과 l2에 있는 데이터로 연산을 완료 (result)
while l1 or l2 :
if l1 != None :
result += l1.val*(10**i)
l1 = l1.next
if l2 != None :
result += l2.val*(10**i)
l2 = l2.next
i += 1
# for문을 돌리기 위해 int인 result를 str로 변경한 모습 (별로 좋다고 생각은 안함)
result = str(result)
# 여기서 진짜 웃긴게 cur을 사용하지 않으면 node가 제대로 이어지지 않는다.
answer = cur = ListNode(0)
# answer = cur = ListNode(0)이 아니고
# answer = ListNode(0)으로 해서 아래 for문을 cur 대신 answer쓰면 제대로 node 형성이 안됨
for i in range(len(result)-1,-1,-1) :
cur.next = ListNode(result[i])
cur = cur.next
# return도 제법 웃겨
return answer.next


# Discuss에서 추천 수 많았던 코드
class Solution:
def addTwoNumbers(self, l1, l2):
carry = 0
root = n = ListNode(0)
while l1 or l2 or carry:
v1 = v2 = 0
if l1:
v1 = l1.val
l1 = l1.next
if l2:
v2 = l2.val
l2 = l2.next
# print(carry)
# print("v1 :",v1,"v2 :",v2)
carry, val = divmod(v1+v2+carry, 10)
# print(carry,val)
n.next = ListNode(val)
n = n.next
return root.next

위의 코드를 보면 결국에 나랑 비슷한 생각인데 나는 올림에 대해 어떻게 해야할지 모르겠어서 연산을 다 마치고 연산이 끝난 데이터를 역순으로 뽑아 node를 만들었다면, 이 사람은 한번에 node까지 만든것을 볼 수 있다. 올림을 저렇게 할 생각을 못했었는데 진짜 똑똑한것 같다.

이 부분에 대해서는 조금 더 공부한 내용을 추가하도록 하겠다! Node를 아주 부셔버리겠어...
'코딩 > 문제' 카테고리의 다른 글
문제13. Leetcode11) Container With Most Water (0) | 2020.12.03 |
---|---|
문제11. LeetCode1) Two Sum (0) | 2020.11.04 |
문제10. (파이썬) 프렌즈 4블록 (0) | 2020.06.16 |
문제9. (파이썬) 비밀 지도 (0) | 2020.06.15 |
문제8. (파이썬) 자카드 유사도 알고리즘 (0) | 2020.06.11 |