Skip to content

[alphaorderly] WEEK 11 Solutions - #2846

Open
alphaorderly wants to merge 2 commits into
DaleStudy:mainfrom
alphaorderly:week-11
Open

[alphaorderly] WEEK 11 Solutions#2846
alphaorderly wants to merge 2 commits into
DaleStudy:mainfrom
alphaorderly:week-11

Conversation

@alphaorderly

@alphaorderly alphaorderly commented Aug 30, 2026

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.

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

binary-tree-maximum-path-sum/alphaorderly.py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
"""
์‹œ๊ฐ„๋ณต์žก๋„: O(n)
๊ณต๊ฐ„๋ณต์žก๋„: O(n)
"""
class Solution:
    def maxPathSum(self, root: Optional[TreeNode]) -> int:
        def calc(node: Optional[TreeNode]):
            if not node:
                # (ํ•œ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ root๋ฅผ ํ–ฅํ•ด ์˜ฌ๋ผ์˜ค๋Š” ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ํ•ฉ, 
                #  ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ ๋‚ด ์ž„์˜ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ)
                return (-float("inf"), -float("inf"))

            # ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๊ฒฐ๊ณผ
            # left: ์™ผ์ชฝ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ root๋ฅผ ํ–ฅํ•ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ
            # left_root: ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์ „์ฒด์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ž„์˜ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ
            left, left_root = calc(node.left)

            # ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๊ฒฐ๊ณผ
            # right: ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ root๋ฅผ ํ–ฅํ•ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ
            # right_root: ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์ „์ฒด์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ž„์˜ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ
            right, right_root = calc(node.right)

            # ํ•œ์ชฝ(์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ) ๋˜๋Š” ์•„๋ฌด์ชฝ๋„ ์•ˆํƒ€๊ฑฐ๋‚˜(0) ํ˜„์žฌ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ, ๋‹จ์ผ ๊ฒฝ๋กœ ์ตœ๋Œ€ ํ•ฉ
            current = max(left, right, 0) + node.val
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ ์ค‘ ์ตœ๋Œ€ ํ•ฉ (๊ฐ ์ž์‹ 0 ๋ฏธ๋งŒ์ด๋ฉด ์•ˆํƒ)
            current_root = max(max(left, 0) + max(right, 0) + node.val, left_root, right_root)

            return (current, current_root)

        _, ans = calc(root)

        return ans
  • ํŒจํ„ด: Binary Search, Tree DP, DFS, Dynamic Programming
  • ์„ค๋ช…: ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ์—์„œ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ํŠธ๋ฆฌ ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•ด ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์€ ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜ DP(Tree DP)์™€ DFS๋ฅผ ํ™œ์šฉํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ํ•˜์œ„ ์ •๋ณด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ ํ•ฉ์ณ ์ตœ๋Œ“๊ฐ’์„ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค.

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

๋ณต์žก๋„
Time O(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.

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

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

๋จผ์ € ํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์— ๋งž๋„๋ก ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜ - 1์ธ์ง€ ํ™•์ธํ•˜๊ณ 
Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋ฉฐ ์‚ฌ์ดํด ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
"""
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 validTree(self, n: int, edges: List[List[int]]) -> bool:

        if len(edges) < n - 1:
            return False

        u = UnionFind(n)

        for a, b in edges:
            if not u.union(a, b):
                return False

        return True
  • ํŒจํ„ด: Union Find
  • ์„ค๋ช…: ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๊ฐ€ ํŠธ๋ฆฌ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Union-Find๋กœ ์‚ฌ์ดํด ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ๊ฐ„์„  ๊ฐœ์ˆ˜๊ฐ€ ๋…ธ๋“œ ์ˆ˜์˜ -1์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•œ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ์ดˆ๊ธฐ ๊ฐ„์„  ๊ฐœ์ˆ˜ ํ™•์ธ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๊ฑฐ์ง“ ์–‘์„ฑ์„ ๊ฑธ๋Ÿฌ๋‚ด๊ณ , ๊ฐ ๊ฐ„์„ ๋งˆ๋‹ค ์‚ฌ์ดํด ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

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

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

@dalestudy

dalestudy Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

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

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

๋ฌธ์ œ ๋‚œ์ด๋„ ์œ ํ˜• ๋ถ„์„
binary-tree-maximum-path-sum Hard โœ… ์˜๋„ํ•œ ์œ ํ˜•
graph-valid-tree Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
merge-intervals Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
missing-number Easy โœ… ์˜๋„ํ•œ ์œ ํ˜•
reorder-list Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•

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

  • ํ’€์ดํ•œ ๋ฌธ์ œ: 50 / 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)
Matrix โ– โ– โ– โ– โ– โ–กโ–ก 3 / 4 (Medium 3)
Linked List โ– โ– โ– โ– โ– โ–กโ–ก 4 / 6 (Easy 3, Hard 1)
Heap โ– โ– โ– โ– โ– โ–กโ–ก 2 / 3 (Hard 1, Medium 1)
Graph โ– โ– โ– โ– โ–กโ–กโ–ก 5 / 8 (Medium 5)
Binary โ– โ– โ– โ– โ–กโ–กโ–ก 3 / 5 (Easy 2, Medium 1)
Tree โ– โ– โ– โ–กโ–กโ–กโ–ก 5 / 14 (Medium 3, Easy 2)
Interval โ–กโ–กโ–กโ–กโ–กโ–กโ–ก 0 / 5 โ† ์•„์ง ์‹œ์ž‘ ์•ˆ ํ•จ

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

๐Ÿ”ข API ์‚ฌ์šฉ๋Ÿ‰ (gpt-5-nano)
์š”์ฒญ ์ž…๋ ฅ ํ† ํฐ ์ถœ๋ ฅ ํ† ํฐ ํ•ฉ๊ณ„ ๋น„์šฉ
1 2,469 243 2,712 $0.000221
2 2,469 185 2,654 $0.000197
ํ•ฉ๊ณ„ 4,938 428 5,366 $0.000418

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.

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

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

1. ์ธํ„ฐ๋ฒŒ์„ ์‹œ์ž‘์‹œ๊ฐ„์ด ์ด๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ๋‹ค.
2. ์ฒซ ๋ฒˆ์งธ ์ธํ„ฐ๋ฒŒ์„ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ์ข…๋ฃŒ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
3. ๋‘ ๋ฒˆ์งธ ์ธํ„ฐ๋ฒŒ๋ถ€ํ„ฐ ์‹œ์ž‘์‹œ๊ฐ„์ด ์ด์ „ ์ธํ„ฐ๋ฒŒ์˜ ์ข…๋ฃŒ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ ์ข…๋ฃŒ์‹œ๊ฐ„์„ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
4. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ์ธํ„ฐ๋ฒŒ์„ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ˜„์žฌ ์ธํ„ฐ๋ฒŒ์„ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ์ข…๋ฃŒ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
5. ๋งˆ์ง€๋ง‰ ์ธํ„ฐ๋ฒŒ์„ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
"""
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort()

        N = len(intervals)
        schedule = []

        start, end = intervals[0]

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

            if event_start <= end:
                end = max(end, event_end)
            else:
                schedule.append([start, end])
                start = event_start
                end = event_end

        schedule.append([start, end])

        return schedule
  • ํŒจํ„ด: Sort, Two Pointers, Greedy
  • ์„ค๋ช…: ๊ตฌํ˜„์€ ๊ฐ„๊ฒฉ์„ ์‹œ์ž‘์  ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค, ์ธ์ ‘ ๊ตฌ๊ฐ„์„ ๋น„๊ตํ•˜๋ฉฐ ๊ฒน์น˜๋ฉด ๋์ ์„ ํ™•์žฅํ•˜๊ณ , ๊ฒน์น˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์  ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์„ ํ˜• ํƒ์ƒ‰๊ณผ ์ •๋ ฌ์„ ๊ฒฐํ•ฉํ•œ ๊ทธ๋ฆฌ๋”” ํŒจํ„ด์œผ๋กœ ํ•ด์„๋œ๋‹ค.

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

๋ณต์žก๋„
Time O(n log 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.

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

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

'target'์„ ๋ฐฐ์—ด์˜ ๊ธธ์ด(n)๋กœ ์„ค์ •ํ•œ ๋’ค, 0๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ ์ธ๋ฑ์Šค์™€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ xor ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ๋ฐฐ์—ด๊ณผ ์ธ๋ฑ์Šค ๋ชจ๋‘์— ์กด์žฌํ•˜๋Š” ๊ฐ’์€ xor ์—ฐ์‚ฐ์œผ๋กœ ์†Œ๊ฑฐ๋˜์–ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค(x ^ x = 0).
์ตœ์ข…์ ์œผ๋กœ ๋‚จ๋Š” ๊ฐ’์ด ๋ฐฐ์—ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ˆ„๋ฝ๋œ ์ˆซ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
"""
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        target = len(nums)
        for i, v in enumerate(nums):
            target ^= i ^ v
        return target
  • ํŒจํ„ด: Bit Manipulation, Two Pointers
  • ์„ค๋ช…: XOR ์—ฐ์‚ฐ์œผ๋กœ ์ธ๋ฑ์Šค์™€ ๊ฐ’์˜ ์ฐจ์ง‘ํ•ฉ์„ ์ œ๊ฑฐํ•˜์—ฌ missing number๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์€ ๋น„ํŠธ ์กฐ์ž‘(Bit Manipulation) ํŒจํ„ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ํ•ด๋ฒ•์€ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ๋™์‹œ์— ๊ฒฐํ•ฉํ•ด ํ•œ ๊ฐ’๋งŒ ๋‚จ๊ธฐ๋Š” ์ „ํ˜•์ ์ธ XOR ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. Two Pointers ํŒจํ„ด์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ, ๋ฐฐ์—ด ์ˆœํšŒ์™€ ๋ˆ„๋ฝ ์›์†Œ ์ฐพ๊ธฐ๋ผ๋Š” ๋งฅ๋ฝ์—์„œ Bit Manipulation์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ๋ฐฐ์—ด ์›์†Œ์™€ ์ธ๋ฑ์Šค์˜ XOR์„ ์ด์šฉํ•ด ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

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

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

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.

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

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

1. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ์ฐพ๋Š”๋‹ค.
2. ์ค‘๊ฐ„ ์ง€์ ๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๋’ค์ง‘๋Š”๋‹ค.
   - ์ด ๊ณผ์ •์—์„œ ์•ž๋ถ€๋ถ„๊ณผ ๋’ท๋ถ€๋ถ„์ด ๋ถ„๋ฆฌ๋œ๋‹ค.
3. ์•ž๋ถ€๋ถ„(head)๊ณผ ๋’ค์ง‘ํžŒ ๋’ท๋ถ€๋ถ„์„ ๊ต์ฐจ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ์žฌ๋ฐฐ์—ดํ•œ๋‹ค.
"""
class Solution:
    def reorderList(self, head: Optional[ListNode]) -> None:
        """
        Do not return anything, modify head in-place instead.
        """
        tortoise = hare = head

        while hare and hare.next:
            tortoise = tortoise.next
            hare = hare.next.next

        prev, curr = None, tortoise
        while curr:
            curr.next, prev, curr = prev, curr, curr.next

        a, b = head, prev
        while b.next:
            a.next, a = b, a.next
            b.next, b = a, b.next
  • ํŒจํ„ด: Two Pointers, Reorder List
  • ์„ค๋ช…: ์ค‘๊ฐ„ ์ง€์  ์ฐพ๊ธฐ์— ํ† ๋ผ-๊ฑฐ๋ถ์ด ํฌ์ธํ„ฐ๋กœ Two Pointers๋ฅผ ์ด์šฉํ•˜๊ณ , ๋’ค์ชฝ ๋ถ€๋ถ„์„ ์—ญ์ˆœ์œผ๋กœ ๋’ค์ง‘์–ด ์•ž๋ถ€๋ถ„๊ณผ ๊ต์ฐจ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜๋Š” ํŒจํ„ด์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ „์ฒด ํ๋ฆ„์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ์ˆœ์ฐจ์  ์กฐ์ž‘๊ณผ ๋ถ€๋ถ„์ง‘ํ•ฉ ์žฌ๊ตฌ์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ๋‘ ๋ฒˆ์˜ ์„ ํ˜• ์ˆœํšŒ๋ฅผ ํ†ตํ•ด in-place ์žฌ๋ฐฐ์—ด์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

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

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.

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

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

'target'์„ ๋ฐฐ์—ด์˜ ๊ธธ์ด(n)๋กœ ์„ค์ •ํ•œ ๋’ค, 0๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ ์ธ๋ฑ์Šค์™€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ xor ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ๋ฐฐ์—ด๊ณผ ์ธ๋ฑ์Šค ๋ชจ๋‘์— ์กด์žฌํ•˜๋Š” ๊ฐ’์€ xor ์—ฐ์‚ฐ์œผ๋กœ ์†Œ๊ฑฐ๋˜์–ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค(x ^ x = 0).
์ตœ์ข…์ ์œผ๋กœ ๋‚จ๋Š” ๊ฐ’์ด ๋ฐฐ์—ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ˆ„๋ฝ๋œ ์ˆซ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
"""
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        target = len(nums)
        for i, v in enumerate(nums):
            target ^= i ^ v
        return target
  • ํŒจํ„ด: Bit Manipulation
  • ์„ค๋ช…: ๋ฐฐ์—ด ์›์†Œ์™€ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ XOR๋กœ ์†Œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ˆ„๋ฝ๋œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ๋น„ํŠธ ์—ฐ์‚ฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜์—ฌ ๋ชจ๋“  ์ธ๋ฑ์Šค์™€ ๊ฐ’๊ณผ์˜ XOR๋ฅผ ๋ˆ„์ ํ•˜๋ฉด ๋‚จ์€ ๊ฐ’์ด ์ •๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ๋ชจ๋“  ์›์†Œ์™€ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ˆœํšŒํ•˜๋ฉฐ XOR ์—ฐ์‚ฐ์œผ๋กœ ๋™์ผํ•œ ๊ฐ’์€ ์†Œ๊ฑฐํ•˜๋ฏ€๋กœ ๋ˆ„๋ฝ๋œ ๊ฐ’์ด ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

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

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

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