-
[ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ] ํฐ๋ฆฐ๋๋กฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ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