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 ์—ฐ์‚ฐ์œผ๋กœ ๋™์ผํ•œ ๊ฐ’์€ ์†Œ๊ฑฐํ•˜๋ฏ€๋กœ ๋ˆ„๋ฝ๋œ ๊ฐ’์ด ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

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

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

@dahyeong-yun
dahyeong-yun self-requested a review September 3, 2026 12:24
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