ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ํŒฐ๋ฆฐ๋“œ๋กฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ
    TECH/Algorithm 2021. 8. 16. 21:50

    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    
    class Solution:
        def isPalindrome(self, head: Optional[ListNode]) -> bool:
    
            head_list = []
            now = head
            while True:
                head_list.append(now.val)
                if now.next != None: 
                    now = now.next
                    continue
                break
    
            if head_list == head_list[::-1]:
                return True
            else:
                return False

    ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, ํŒฐ๋ฆฐ๋“œ๋กฌ ํ™•์ธ ์ž‘์—…์„ ๊ฑฐ์ณค๋‹ค.

          #  if head_list == head_list[::-1]:
          #      return True
          #  else:
          #      return False
    
           while len(head_list) > 1:
                   if head_list.pop(0) != head_list.pop()
                    return False
           return True

    if๋ฌธ์„ ๋ฐฐ์—ด์„ ๋’ค์ง‘๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ๋ฐฐ์—ด์—์„œ pop() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

     


     

    ํ•˜์ง€๋งŒ, head_list.pop(0)์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ์„ ์ถ”์ถœํ•  ๋•Œ ์†๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋งจ ์•ž ์•„์ดํ…œ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์ ์ ˆํ•œ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ๋กœ, ์‹œ๊ฐ„ ๋ณต์žก๋„ O(1)์œผ๋กœ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ํšจ์œจ์ ์ด๋‹ค.

    import collections
    
    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    class Solution:
        def isPalindrome(self, head: Optional[ListNode]) -> bool:
            head_list = collections.deque()
            if not head:
                return True
            node = head
            while node is not None:
                head_list.append(node.val)
                node = node.next
    
            while len(head_list)>1:
                if head_list.popleft() != head_list.pop():
                    return False
            return True

    ๋ฐํฌ(deque)๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„๊ณผ, pop() ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฅด๊ณ  ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๋™์ผํ•˜๋‹ค.

     


     

    ์ด๋ฒˆ์—” ๋ฐฐ์—ด์ด๋‚˜ ๋ฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ทธ๋Œ€๋กœ ํ’€์ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    2๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋Ÿฐ๋„ˆ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋ณด๋‹ค ์•ž์„œ๊ฒŒ ํ•ด ๋ณ‘ํ•ฉ ์ง€์ , ์ค‘๊ฐ„ ์œ„์น˜ ๋“ฑ์„ ํŒ๋ณ„ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๋ฐฐ ์ฐจ์ด๋‚˜๋Š” ๋น ๋ฅธ ๋Ÿฐ๋„ˆ, ๋Š๋ฆฐ ๋Ÿฐ๋„ˆ๋ฅผ ๊ฐ๊ฐ ๋‘๊ณ  ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค. ๋น ๋ฅธ ๋Ÿฐ๋„ˆ๊ฐ€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋Š๋ฆฐ ๋Ÿฐ๋„ˆ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ค‘๊ฐ„ ์ง€์ ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ค‘๊ฐ„ ์ง€์ ์—์„œ๋ถ€ํ„ฐ ๊ฐ’์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ๋’ค์ง‘๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    1->2->3->2->1 ์ธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋Ÿฐ๋„ˆ๋ฅผ ์ ์šฉํ•˜๋Š” ํ’€์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

     

     

    ์ „์ฒด ์ฝ”๋“œ

    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    class Solution:
        def isPalindrome(self, head: Optional[ListNode]) -> bool:
            rev = None
            slow = fast = head
    
            while fast and fast.next:
                fast = fast.next.next
                rev, rev.next, slow = slow, rev, slow.next
                # ํŒŒ์ด์ฌ ๋‹ค์ค‘ ํ• ๋‹น์ด ์ค‘์š”ํ•œ ์ฝ”๋“œ
            if fast:
                slow = slow.next
    
    
            while rev and rev.val == slow.val:
                slow, rev = slow.next, rev.next
            return not rev
    slow = fast = head

    ๋น ๋ฅธ ๋Ÿฐ๋„ˆ fast์™€ ๋Š๋ฆฐ ๋Ÿฐ๋„ˆ slow๋Š” head๋ฅผ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

     

     

    while fast and fast.next:
        fast = fast.next.next
        rev, rev.next, slow = slow, rev, slow.next

    fast์˜ next๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ fast๋ฅผ ๋‘ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.

    ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์—ญ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” rev์™€ ๋Š๋ฆฐ ๋Ÿฐ๋„ˆ slow๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์ธ๋ฐ, ๊ผญ ๋‹ค์ค‘ ํ• ๋‹น์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

     

     

    rev, rev.next = slow, rev
    slow = slow.next

    ๋งŒ์ผ, ์œ„์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์— ๋‚˜๋ˆ„์–ด rev์™€ slow๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์„๊นŒ?

    rev = 1, slow = 2->3 (slow๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, slow.next=3์ด๋ผ๋Š” ์˜๋ฏธ)์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ

    ํ•œ ์ค„๋กœ ํ•œ๊บผ๋ฒˆ์— ๋‹ค์ค‘ ํ• ๋‹นํ•œ rev, rev.next, slow = slow, rev, slow.next์˜ ๊ฒฝ์šฐ๋Š”

    rev = 2->3, rev.next = 1, slow = 3์ด ๋˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ rev = 2->1, slow = 3์ด ๋œ๋‹ค.

    ์ž‘์—…์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ž‘์—…์ด ์ค‘๊ฐ„ ๊ณผ์ • ์—†์ด ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋๋‚œ๋‹ค.

     

     

    ๊ทธ๋ ‡์ง€๋งŒ ๋˜‘๊ฐ™์ด rev = 1, slow = 2->3 ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ 

    rev, rev.next = slow, rev  
    slow = slow.next

    ์ฒ˜๋Ÿผ ๋‚˜๋ˆ ์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด,

    rev = 2->3, rev.next = 1 ๋”ฐ๋ผ์„œ rev = 2->1์ด ๋œ๋‹ค.

    ์—ฌ๊ธฐ์„œ rev=slow์˜€๊ธฐ ๋•Œ๋ฌธ์— slow๋„ ํ•จ๊ป˜ 2->1์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ slow = slow.next๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” 3์ด ์•„๋‹Œ 1์ด ๋˜์–ด slow = 1์ด ๋œ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ•œ ์ค„์˜ ๋‹ค์ค‘ ํ• ๋‹น์ด ํ•„์š”ํ•˜๋‹ค.

     

     

    if fast:
        slow = slow.next

    ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ™€์ˆ˜์ผ ๋•Œ์™€ ์ง์ˆ˜์ผ ๋•Œ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 1->2->3->2->1์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ์—๋Š” slow ๋Ÿฐ๋„ˆ๊ฐ€ ์ค‘์•™๊ฐ’์ธ 3์—์„œ ๋๋‚˜๋Š”๋ฐ, 3์€ ํŒฐ๋ฆฐ๋“œ๋กฌ ์ฒดํฌ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ fast๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ฐ’์—์„œ ๋๋‚˜๋Š” ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ, slow๋ฅผ ํ•œ ์นธ ๋” ์ด๋™ํ•œ๋‹ค.

     

     

    ๋‹ค์Œ์œผ๋กœ๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

    while rev and rev.val == slow.val:
        slow, rev = slow.next, rev.next
    
    return not rev

    rev๊ฐ€ ์กด์žฌํ•˜๊ณ , rev์˜ ๊ฐ’๊ณผ slow์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด slow์™€ rev๋ฅผ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜์—ฌ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋น„๊ตํ•œ๋‹ค.

    ๋งŒ์ผ, rev.val๊ณผ slow.val์ด ๋‹ค๋ฅด๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋ฏ€๋กœ while๋ฌธ์„ ๋น ์ ธ๋‚˜์™€ ๋ฐ”๋กœ not rev(rev๊ฐ€ ๋๊นŒ์ง€ ์ด๋™ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ฐ’์ด ์กด์žฌํ•˜๋ฏ€๋กœ rev๋Š” True)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๋งž๋‹ค๋ฉด slow์™€ rev ๋ชจ๋‘ ๋๊นŒ์ง€ ์ด๋™ํ•ด ๋‘˜ ๋‹ค None์ด ๋œ๋‹ค. None์€ False๋กœ ๋ถ„๋ฅ˜๋˜๋ฏ€๋กœ, True๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

     

    return not rev ๋Œ€์‹  return not slow๋ผ๊ณ  ์จ๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

    ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ’€์ดํ•œ ๋Ÿฐ๋„ˆ ๋ฐฉ์‹ ํ’€์ด์˜€๋‹ค.

    ์—ญ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” rev ๋ถ€๋ถ„์—์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๋‹ค์ค‘ ํ• ๋‹น์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ๊ฐ„๋‹ค.

    ํ•œ ์ค„๋กœ ๋‹ค์ค‘ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ผญ ์—ผ๋‘ํ•ด ๋‘์ž.

    'TECH > Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [Programmers] ๋ชจ์˜๊ณ ์‚ฌ  (0) 2022.01.08

    ๋Œ“๊ธ€

Designed by Tistory.