๐Ÿ’ซ ETC/Leetcode

Week 1-2. [Linked List] 2. Add Two Numbers (Python3)

ming412 2023. 8. 29. 00:02

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/add-two-numbers/?envType=study-plan-v2&envId=top-interview-150 

 

Add Two Numbers - LeetCode

Can you solve this real interview question? Add Two Numbers - You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and

leetcode.com

๋‘ ๊ฐœ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋˜ ๋‹ค๋ฅธ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ผ.
  • ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž๋Š” ์—ญ์ˆœ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. ex. 2->4->3 : 342
  • ๊ฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ head ๋…ธ๋“œ๋Š” 0์ด ์•„๋‹ˆ๋‹ค.
  • ๊ฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ์ˆ˜๋Š” [1, 100]์ด๋‹ค.
  • Node.val์€ [0, 9]์ด๋‹ค.

 

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž๊ฐ€ ์—ญ์ˆœ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. (head์—์„œ tail ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜๋Š” ์—†๋‹ค.)

๋”ฐ๋ผ์„œ head๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ˆซ์ž๋ฅผ ๋งŒ๋“ค์–ด๊ฐ„ ๋’ค ๋งˆ์ง€๋ง‰์— reverse ํ•ด์ฃผ์–ด ํ•ฉ์„ ๊ณ„์‚ฐํ–ˆ๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

์ฃผ์–ด์ง„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•ด์•ผ ํ•˜๋ฏ€๋กœ linear search๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

head = l1
while head๊ฐ€ None์ด ์•„๋‹Œ ๋™์•ˆ:
	head.val์„ L1์— ๋ˆ„์ ํ•œ๋‹ค
    head์— head.next๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค
    
head = l2
while head๊ฐ€ None์ด ์•„๋‹Œ ๋™์•ˆ:
	head.val์„ L2์— ๋ˆ„์ ํ•œ๋‹ค
    head์— head.next๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค
    
int(L1[::-1])๊ณผ int(L2[::-1])๋ฅผ ํ•ฉํ•œ๋‹ค.

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

๋‘ ๊ฐœ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๊ตฌํ˜„ํ•˜์˜€์œผ๋‚˜ ๋˜ ๋‹ค๋ฅธ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
       
        L1, L2 = '', '' # ๊ฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธด ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ฌธ์ž์—ด (์—ญ์ˆœ์œผ๋กœ ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด์— ์ €์žฅํ•œ๋‹ค)

        head = l1
        while head != None:
            L1 += str(head.val)
            head = head.next # ํ•œ ์นธ ์ด๋™

        head = l2
        while head != None:
            L2 += str(head.val)
            head = head.next # ํ•œ ์นธ ์ด๋™

		# ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž๊ฐ€ ์—ญ์ˆœ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์—ˆ์œผ๋‹ˆ, reverse ํ•˜์—ฌ ํ•ฉํ•œ๋‹ค.
        ans = int(L1[::-1]) + int(L2[::-1])

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

l1๊ณผ l2์˜ ๊ธธ์ด๋ฅผ N์ด๋ผ๊ณ  ํ•  ๋•Œ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

N์ด ์ตœ๋Œ€ 100์ด๋ฏ€๋กœ O(N)์œผ๋กœ ๊ฑฐ๋œฌํ•˜๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๊ฐ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ˆซ์ž๋ฅผ ๋งŒ๋“ค ๋•Œ, ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž์˜ ๋ณ€ํ™˜์ด ์žฆ์•„ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆซ์ž๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์„๊นŒ.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

L1๊ณผ L2์˜ ํƒ€์ž…์„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์ •์ˆ˜๋กœ ์ง€์ •ํ–ˆ๋‹ค. 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” head์™€ linked_lst๋ฅผ ์„ ์–ธํ•œ ๋’ค cur ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ์ด์–ด๋ถ™์ธ๋‹ค.

# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
       
        L1, L2 = 0, 0

        tmp = 1
        head = l1
        while head != None:
            L1 += head.val * tmp
            head = head.next # ๋…ธ๋“œ ํ•œ ์นธ ์ด๋™
            tmp *= 10 # โœ… ์ž๋ฆฌ ์ˆ˜ ์ด๋™

        tmp = 1
        head = l2
        while head != None:
            L2 += head.val * tmp
            head = head.next # ๋…ธ๋“œ ํ•œ ์นธ ์ด๋™
            tmp *= 10 # โœ… ์ž๋ฆฌ ์ˆ˜ ์ด๋™

        ans = L1 + L2

		# โœ… ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        head = None
        linked_lst = None
        for x in str(ans):
            if not head:
                head = ListNode(int(x))
                linked_lst = head
            else:
                cur = ListNode(int(x), linked_lst) # โœ… cur ๋…ธ๋“œ์˜ next์— ๊ธฐ์กด ๋…ธ๋“œ(linked_lst)๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค
                linked_lst = cur # โœ… ๊ฐฑ์‹ 
        return linked_lst

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

๋А๋‚€ ์ 

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ ์ต์ˆ™ํ–ˆ์œผ๋‚˜ ์ƒˆ๋กœ์šด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ด ๋‚ฏ์„ค์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ตฌํ˜„์€ ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ–ˆ๋‹ค. ์ ์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.