Skip to content

[alphaorderly] WEEK 12 Solutions - #2854

Open
alphaorderly wants to merge 1 commit into
DaleStudy:mainfrom
alphaorderly:week-12
Open

[alphaorderly] WEEK 12 Solutions#2854
alphaorderly wants to merge 1 commit into
DaleStudy:mainfrom
alphaorderly:week-12

Conversation

@alphaorderly

Copy link
Copy Markdown
Contributor

๋‹ต์•ˆ ์ œ์ถœ ๋ฌธ์ œ

์ž‘์„ฑ์ž ์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • Projects์˜ ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ(โ–ผ)์„ ๋ˆŒ๋Ÿฌ ํ™•์žฅํ•œ ๋’ค, Week๋ฅผ ํ˜„์žฌ ์ฃผ์ฐจ๋กœ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.
  • ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ‘ธ์‹œ๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ Status๋ฅผ In Review๋กœ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.
  • ์ฝ”๋“œ ๊ฒ€ํ† ์ž 1๋ถ„ ์ด์ƒ์œผ๋กœ๋ถ€ํ„ฐ ์Šน์ธ์„ ๋ฐ›์œผ์…จ๋‹ค๋ฉด PR์„ ๋ณ‘ํ•ฉํ•ด์ฃผ์„ธ์š”.

๊ฒ€ํ† ์ž ์ฒดํฌ ๋ฆฌ์ŠคํŠธ

Important

๋ณธ์ธ ๋‹ต์•ˆ ์ œ์ถœ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ถ„ PR ํ•˜๋‚˜ ์ด์ƒ์„ ๋ฐ˜๋“œ์‹œ ๊ฒ€ํ† ๋ฅผ ํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค!

  • ๋ฐ”๋กœ ์ด์ „์— ์˜ฌ๋ผ์˜จ PR์— ๋ณธ์ธ์„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์–ด๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.
  • ๋ณธ์ธ์ด ๊ฒ€ํ† ํ•ด์•ผํ•˜๋Š” PR์˜ ๋‹ต์•ˆ ์ฝ”๋“œ์— ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์„ธ์š”.
  • ํ† ์š”์ผ ์ „๊นŒ์ง€ PR์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šน์ธํ•ด์ฃผ์„ธ์š”.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด ๋ถ„์„

non-overlapping-intervals/alphaorderly.py
"""
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
#
# 1. ์ธํ„ฐ๋ฒŒ์„ ๋์ ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
# 2. ์ฒซ ๋ฒˆ์งธ ์ธํ„ฐ๋ฒŒ์˜ ๋์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ,
#    ๋‹ค์Œ ์ธํ„ฐ๋ฒŒ์˜ ์‹œ์ž‘์ ์ด ํ˜„์žฌ ๋์ ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ฒน์น˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
#    - ๊ฒน์น˜๋ฉด(count += 1) ๋์ ์€ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.
#    - ๊ฒน์น˜์ง€ ์•Š์œผ๋ฉด ๋์ ์„ ํ˜„์žฌ ์ธํ„ฐ๋ฒŒ์˜ ๋์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
# 3. ๋งˆ์ง€๋ง‰์— ์นด์šดํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
#
# ์™œ ์ตœ์„ ์ธ๊ฐ€?
# - ๋์ ์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ๋‚จ๊ฒจ๋‘๋ฉด ์ดํ›„๋กœ ๋” ๋งŽ์€ ์ธํ„ฐ๋ฒŒ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
# - ์ด๋Š” ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ธํ„ฐ๋ฒŒ์„ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ์ธํ„ฐ๋ฒŒ๋งŒ ์ œ๊ฑฐํ•˜๊ฒŒ ๋˜๋Š” ๊ทธ๋ฆฌ๋”” ์ „๋žต์ด๋‹ค.
"""
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda k: k[1])
        N = len(intervals)

        count = 0
        end = intervals[0][1]

        for i in range(1, N):
            event_start, event_end = intervals[i]

            if event_start < end:
                count += 1
            else:
                end = event_end

        return count
  • ํŒจํ„ด: Greedy
  • ์„ค๋ช…: ์ฃผ์š” ์•„์ด๋””์–ด๊ฐ€ ๋์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค, ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ตœ์†Œ ์ œ๊ฑฐ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ์ „๋žต์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋์ ์ด ์ž‘์€ ์ธํ„ฐ๋ฒŒ์„ ๋‚จ๊ฒจ๋‘๊ณ , ๊ฒน์น˜๋ฉด ์ œ๊ฑฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋์ ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์œ ์ € ๋ถ„์„ ์‹ค์ œ ๋ถ„์„ ๊ฒฐ๊ณผ
Time O(n log n) O(n log n) โœ…
Space O(1) O(1) โœ…

ํ”ผ๋“œ๋ฐฑ: ์ข…๋ฃŒ์ ์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ธ์„œ ์ œ๊ฑฐ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ถ”๊ฐ€ ๊ณต๊ฐ„์€ ์ƒ์ˆ˜

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์ด ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด ๋ถ„์„

number-of-connected-components-in-an-undirected-graph/alphaorderly.py
"""
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (Union Find ์—ฐ์‚ฐ์€ ๊ฒฝ๋กœ ์••์ถ•๊ณผ rank ํ™œ์šฉ์œผ๋กœ Amortized O(1))
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
#
# Union-Find(์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ, Disjoint Set Union) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ์š”์†Œ(connected components) ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
#
# ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„:
# 1. ๊ฐ ๋…ธ๋“œ๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๋ถ€๋ชจ๋กœ ๊ฐ–๋„๋ก(parent ๋ฐฐ์—ด) ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
# 2. ํŠธ๋ฆฌ์˜ ๊นŠ์ด(๋žญํฌ, rank)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
# 3. ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ union ์—ฐ์‚ฐ์œผ๋กœ ๋‘ ๋…ธ๋“œ๋ฅผ ๊ฐ™์€ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์นœ๋‹ค.
#    - ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ์—” ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
#    - ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋ฉด, ์—ฐ๊ฒฐ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
# 4. ๋ชจ๋“  ๊ฐ„์„ ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚จ์€ ์—ฐ๊ฒฐ ์š”์†Œ ๊ฐœ์ˆ˜(ans)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
"""
class UnionFind:
    def __init__(self, n: int):
        self.parent = [-1] * n
        self.rank = [0] * n

    def find(self, target: int) -> int:
        if self.parent[target] == -1:
            return target

        self.parent[target] = self.find(self.parent[target])
        return self.parent[target]

    def union(self, a: int, b: int) -> bool:
        a = self.find(a)
        b = self.find(b)

        if a == b:
            return False

        if self.rank[a] < self.rank[b]:
            a, b = b, a

        self.parent[b] = a
        if self.rank[a] == self.rank[b]:
            self.rank[a] += 1

        return True

class Solution:
    def countComponents(self, n: int, edges: List[List[int]]) -> int:
        uf = UnionFind(n)
        ans = n

        for a, b in edges:
            if uf.union(a, b):
                ans -= 1

        return ans
  • ํŒจํ„ด: Union Find
  • ์„ค๋ช…: ์ฃผ์–ด์ง„ ์ฝ”๋“œ๋Š” ์„œ๋กœ์˜ ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Disjoint Set Union)๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ•ฉ์น˜๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์ด๋ฉด ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

๋ณต์žก๋„
Time O(n + m ฮฑ(n))
Space O(n)

ํ”ผ๋“œ๋ฐฑ: ์ดˆ๊ธฐํ™”์™€ ํŒจ๋ŸฐํŠธ/๋žญํฌ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋ฉฐ ์—ฐ๊ฒฐ ์š”์†Œ ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์ด ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ํ’€์ด์— ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋ณด์„ธ์š”!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด ๋ถ„์„

remove-nth-node-from-end-of-list/alphaorderly.py
"""
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
#
# ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ(one pass)๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋์—์„œ n๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•:
# 1. dummy ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด head์˜ ์•ž์— ์—ฐ๊ฒฐํ•œ๋‹ค.
# 2. forerunner ํฌ์ธํ„ฐ๋ฅผ n์นธ ๋จผ์ € ์ด๋™์‹œํ‚จ๋‹ค.
# 3. forerunner์™€ lastcomer(์ดˆ๊ธฐ: dummy)๋ฅผ ๊ฐ™์ด ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ, forerunner๊ฐ€ ๋(None)์— ๋„๋‹ฌํ•˜๋ฉด lastcomer๋Š” ์ œ๊ฑฐํ•  ๋…ธ๋“œ ๋ฐ”๋กœ ์•ž์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
# 4. lastcomer.next๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ n๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
"""
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy = ListNode(0)
        dummy.next = head

        forerunner = head
        lastcomer = dummy

        for _ in range(n):
            forerunner = forerunner.next

        while forerunner:
            forerunner = forerunner.next
            lastcomer = lastcomer.next

        lastcomer.next = lastcomer.next.next

        return dummy.next
  • ํŒจํ„ด: Two Pointers, Linked List
  • ์„ค๋ช…: ๋ชฉ์  ๋…ธ๋“œ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๋‘ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด์œผ๋กœ, ํ•˜๋‚˜๋ฅผ n์นธ ๋จผ์ € ์›€์ง์ด๊ณ  ์ดํ›„ ๊ฐ™์ด ํ•œ ์นธ์”ฉ ์ด๋™์‹œํ‚ค๋ฉฐ ํƒ€๊ฒŸ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์œ ์ € ๋ถ„์„ ์‹ค์ œ ๋ถ„์„ ๊ฒฐ๊ณผ
Time O(n) O(n) โœ…
Space O(1) O(1) โœ…

ํ”ผ๋“œ๋ฐฑ: ๋”๋ฏธ ํ—ค๋“œ ๋ฐ ๋‘ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ œ๊ฑฐ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์—ฐ๊ฒฐ์„ ๋Š๋Š”๋‹ค

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์ด ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Comment thread same-tree/alphaorderly.py

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด ๋ถ„์„

same-tree/alphaorderly.py
"""
์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)
๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)

์žฌ๊ท€์ ์œผ๋กœ ๋‘ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
"""
class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        # ๋‘ ๋…ธ๋“œ๊ฐ€ ๋‘˜๋‹ค None ์ด๋ฉด True ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        if p is q:
            return True

        # ๋‘ ๋…ธ๋“œ์ค‘ ํ•˜๋‚˜๊ฐ€ None ์ด๋ฉด False ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        if not (p and q):
            return False

        # ๋‘˜๋‹ค None์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋น„๊ตํ•œ๋‹ค.
        return (
            p.val == q.val
            and self.isSameTree(p.left, q.left)
            and self.isSameTree(p.right, q.right)
        )
  • ํŒจํ„ด: Binary Search, Depth-First Search, Tre e Pattern
  • ์„ค๋ช…: ์ถ”๊ฐ€ ์„ค๋ช…: ์ด ์ฝ”๋“œ๋Š” ๋‘ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๋™์ผ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ฐ ๋…ธ๋“œ์—์„œ ์ขŒ์šฐ ์ž์‹์œผ๋กœ DFS ๋ฐฉ์‹์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์—์„œ DFS์˜ ํŠน์„ฑ์„ ๋ˆ๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

๋ณต์žก๋„
Time O(n)
Space O(h)

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

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์ด ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ํ’€์ด์— ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋ณด์„ธ์š”!

@dalestudy

dalestudy Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

๐Ÿ“Š alphaorderly ๋‹˜์˜ ํ•™์Šต ํ˜„ํ™ฉ

์ด๋ฒˆ ์ฃผ ์ œ์ถœ ๋ฌธ์ œ

๋ฌธ์ œ ๋‚œ์ด๋„ ์œ ํ˜• ๋ถ„์„
non-overlapping-intervals Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
number-of-connected-components-in-an-undirected-graph Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
remove-nth-node-from-end-of-list Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
same-tree Easy โœ… ์˜๋„ํ•œ ์œ ํ˜•
serialize-and-deserialize-binary-tree Hard โœ… ์˜๋„ํ•œ ์œ ํ˜•

๋ˆ„์  ํ•™์Šต ์š”์•ฝ

  • ํ’€์ดํ•œ ๋ฌธ์ œ: 55 / 75๊ฐœ
  • ์ด๋ฒˆ ์ฃผ ์œ ํ˜• ์ผ์น˜์œจ: 100% (5๋ฌธ์ œ ์ค‘ 5๋ฌธ์ œ ์ผ์น˜)

๋ฌธ์ œ ํ’€์ด ํ˜„ํ™ฉ

์นดํ…Œ๊ณ ๋ฆฌ ์ง„ํ–‰๋„ ์™„๋ฃŒ
Array โ– โ– โ– โ– โ– โ– โ–  10 / 10 (Medium 7, Easy 3)
Dynamic Programming โ– โ– โ– โ– โ– โ– โ–ก 10 / 11 (Easy 1, Medium 9)
String โ– โ– โ– โ– โ– โ– โ–ก 9 / 10 (Medium 5, Hard 1, Easy 3)
Linked List โ– โ– โ– โ– โ– โ– โ–ก 5 / 6 (Easy 3, Hard 1, Medium 1)
Binary โ– โ– โ– โ– โ– โ– โ–ก 4 / 5 (Easy 3, Medium 1)
Graph โ– โ– โ– โ– โ– โ–กโ–ก 6 / 8 (Medium 6)
Matrix โ– โ– โ– โ– โ– โ–กโ–ก 3 / 4 (Medium 3)
Heap โ– โ– โ– โ– โ– โ–กโ–ก 2 / 3 (Hard 1, Medium 1)
Tree โ– โ– โ– โ–กโ–กโ–กโ–ก 6 / 14 (Hard 1, Medium 3, Easy 2)
Interval โ– โ–กโ–กโ–กโ–กโ–กโ–ก 1 / 5 (Medium 1)

๐Ÿค– ์ด ๋Œ“๊ธ€์€ GitHub App์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ข API ์‚ฌ์šฉ๋Ÿ‰ (gpt-5-nano)
์š”์ฒญ ์ž…๋ ฅ ํ† ํฐ ์ถœ๋ ฅ ํ† ํฐ ํ•ฉ๊ณ„ ๋น„์šฉ
1 2,641 204 2,845 $0.000214

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿท๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด ๋ถ„์„

serialize-and-deserialize-binary-tree/alphaorderly.py
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

"""
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
#
# ์ด ์ฝ”๋“œ๋Š” preorder(์ „์œ„ ์ˆœํšŒ)๋ฅผ ์ด์šฉํ•ด ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ ,
# ๋‹ค์‹œ preorder ์ˆœ์„œ๋กœ ๋ฌธ์ž์—ด์„ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋ณต์›ํ•œ๋‹ค.
#
# 1. serialize ํ•จ์ˆ˜๋Š” preorder ์ˆœํšŒ๋กœ ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•˜๊ณ ,
#    None ์ž๋ฆฌ๋Š” ํŠน์ˆ˜๋ฌธ์ž(*)๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.
# 2. deserialize ํ•จ์ˆ˜๋Š” preorder ์ˆœ์„œ์˜ ๋ฌธ์ž์—ด์„ ํ•œ ํ•ญ๋ชฉ์”ฉ ์ฝ์–ด๊ฐ€๋ฉฐ
#    *์ด๋ฉด None, ์ˆซ์ž๋ฉด ๊ทธ ๊ฐ’์˜ TreeNode๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
"""
class Codec:

    def serialize(self, root):
        ans = []

        def preorder(node: Optional[TreeNode]):
            if not node:
                ans.append("*")
                return

            ans.append(str(node.val))
            preorder(node.left)
            preorder(node.right)

        preorder(root)
        return ','.join(ans)

    def deserialize(self, data):
        data = iter(data.split(','))

        def preorder() -> TreeNode:
            current = next(data)

            if current == '*':
                return None

            node = TreeNode(int(current))
            node.left = preorder()
            node.right = preorder()

            return node

        return preorder()


# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
  • ํŒจํ„ด: Depth-First Search, Binary Search, Divide and Conquer, Hash Map / Hash Set
  • ์„ค๋ช…: ์ „์œ„ ์ˆœํšŒ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ์žฌ๊ท€์ ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑ/๋ณต์›ํ•˜๋ฏ€๋กœ DFS ๊ตฌ์„ฑ์ด๋ฉฐ, ์žฌ๊ท€์  ํƒ์ƒ‰์ด ํ•ต์‹ฌ์ด๋‹ค. ๋ฌธ์ œ ๋งฅ๋ฝ์—์„œ ๋ถ„ํ• ๋œ ์„œ๋ธŒํŠธ๋ฆฌ ์žฌ๊ตฌ์„ฑ์€ Divide and Conquer์˜ ์„ฑ๊ฒฉ๋„ ๋ณด์ธ๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์œ ์ € ๋ถ„์„ ์‹ค์ œ ๋ถ„์„ ๊ฒฐ๊ณผ
Time O(n) O(n) โœ…
Space O(n) O(n) โœ…

ํ”ผ๋“œ๋ฐฑ: None ๋…ธ๋“œ๋„ '*'๋กœ ํ‘œ๊ธฐํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ•œ๋‹ค

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์ด ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Development

Successfully merging this pull request may close these issues.

1 participant