Skip to content

[alphaorderly] WEEK 09 Solutions - #2822

Open
alphaorderly wants to merge 6 commits into
DaleStudy:mainfrom
alphaorderly:week-09
Open

[alphaorderly] WEEK 09 Solutions#2822
alphaorderly wants to merge 6 commits into
DaleStudy:mainfrom
alphaorderly:week-09

Conversation

@alphaorderly

@alphaorderly alphaorderly commented Aug 15, 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.

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

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

1. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  - ํ† ๋ผ : ๋‘ ์นธ์”ฉ ์ด๋™
  - ๊ฑฐ๋ถ์ด : ํ•œ ์นธ์”ฉ ์ด๋™
2. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค.
3. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚˜๋ฉด ์‚ฌ์ดํด์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.
4. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์ดํด์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

# ์›๋ฆฌ #
- ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๋Š” ๊ฒฐ๊ตญ ๋์— ๋„๋‹ฌํ•œ๋‹ค.
- ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๋Š” ๊ฒฐ๊ตญ ์‚ฌ์ดํด ๋‚ด์—์„œ ๋งŒ๋‚œ๋‹ค.
"""
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        hare = head
        tortoise = head

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

            if hare is tortoise:
                return True

        return False
  • ํŒจํ„ด: Two Pointers, Fast & Slow Pointers
  • ์„ค๋ช…: ํ•ด๋‹น ์ฝ”๋“œ๋Š” ํ† ๋ผ-๊ฑฐ๋ถ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๊ฐ™์€ ํฌ์ธํ„ฐ ๋‘ ๊ฐœ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์†๋„๋กœ ์›€์ง์—ฌ ์ˆœํ™˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๊ฑด๋„ˆ๊ฐ€๋ฉฐ ์ˆœํ™˜ ์—ฌ๋ถ€๋ฅผ O(n) ์‹œ๊ฐ„, O(1) ๊ณต๊ฐ„์œผ๋กœ ํƒ์ง€ํ•œ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ˆœ์ฐจ ํƒ์ƒ‰ ์ค‘ ์‚ฌ์ดํด ์—ฌ๋ถ€๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•œ๋‹ค. ์ถ”๊ฐ€ ๊ณต๊ฐ„์€ ์ƒ์ˆ˜๋กœ ์œ ์ง€๋œ๋‹ค.

๊ฐœ์„  ์ œ์•ˆ: ํ˜„์žฌ ๊ตฌํ˜„์€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ์ž…๋ ฅ head๊ฐ€ None์ธ ๊ฒฝ์šฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์–ด ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋” robustํ•ฉ๋‹ˆ๋‹ค.

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

@dalestudy

dalestudy Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

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

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

๋ฌธ์ œ ๋‚œ์ด๋„ ์œ ํ˜• ๋ถ„์„
linked-list-cycle Easy โœ… ์˜๋„ํ•œ ์œ ํ˜•
maximum-product-subarray Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
minimum-window-substring Hard โš ๏ธ ์œ ํ˜• ๋ถˆ์ผ์น˜
pacific-atlantic-water-flow Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•
sum-of-two-integers Medium โœ… ์˜๋„ํ•œ ์œ ํ˜•

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

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

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

์นดํ…Œ๊ณ ๋ฆฌ ์ง„ํ–‰๋„ ์™„๋ฃŒ
Dynamic Programming โ– โ– โ– โ– โ– โ– โ–ก 9 / 11 (Easy 1, Medium 8)
Array โ– โ– โ– โ– โ– โ– โ–ก 8 / 10 (Medium 5, Easy 3)
String โ– โ– โ– โ– โ– โ– โ–ก 8 / 10 (Medium 5, Easy 3)
Matrix โ– โ– โ– โ– โ– โ–กโ–ก 3 / 4 (Medium 3)
Binary โ– โ– โ– โ–กโ–กโ–กโ–ก 2 / 5 (Easy 2)
Graph โ– โ– โ– โ–กโ–กโ–กโ–ก 3 / 8 (Medium 3)
Linked List โ– โ– โ–กโ–กโ–กโ–กโ–ก 2 / 6 (Easy 2)
Heap โ– โ– โ–กโ–กโ–กโ–กโ–ก 1 / 3 (Medium 1)
Tree โ– โ– โ–กโ–กโ–กโ–กโ–ก 4 / 14 (Medium 3, Easy 1)
Interval โ–กโ–กโ–กโ–กโ–กโ–กโ–ก 0 / 5 โ† ์•„์ง ์‹œ์ž‘ ์•ˆ ํ•จ

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

๐Ÿ”ข API ์‚ฌ์šฉ๋Ÿ‰ (gpt-5-nano)
์š”์ฒญ ์ž…๋ ฅ ํ† ํฐ ์ถœ๋ ฅ ํ† ํฐ ํ•ฉ๊ณ„ ๋น„์šฉ
1 3,373 201 3,574 $0.000249

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.

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

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

- ๋งŒ์•ฝ ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด, ์–‘์ˆ˜ ์ตœ๋Œ€๊ฐ’(pos)๊ณผ ์Œ์ˆ˜ ์ตœ์†Œ๊ฐ’(neg)์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค.
  - ์ด์œ : ์Œ์ˆ˜ * ์Œ์ˆ˜ = ์–‘์ˆ˜์ด๋ฏ€๋กœ, ์Œ์ˆ˜๋ฅผ ๋งŒ๋‚˜๋ฉด ์ตœ๋Œ€๊ฐ’/์ตœ์†Œ๊ฐ’ ํ›„๋ณด๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
- pos์™€ neg๋ฅผ nums์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  - pos: ํ˜„์žฌ๊นŒ์ง€์˜ ์–‘์ˆ˜ ๊ณฑ์…ˆ ์ตœ๋Œ€๊ฐ’
  - neg: ํ˜„์žฌ๊นŒ์ง€์˜ ์Œ์ˆ˜ ๊ณฑ์…ˆ ์ตœ์†Œ๊ฐ’
- ans๋ฅผ nums์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  - ans: ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ณฑ์…ˆ ๊ฒฐ๊ณผ
- nums์˜ ๋‘ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ pos์™€ neg๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  - pos๋Š” ํ˜„์žฌ ์ˆซ์ž์™€ pos*ํ˜„์žฌ ์ˆซ์ž ์ค‘ ํฐ ๊ฐ’
  - neg๋Š” ํ˜„์žฌ ์ˆซ์ž์™€ neg*ํ˜„์žฌ ์ˆซ์ž ์ค‘ ์ž‘์€ ๊ฐ’
- ans๋ฅผ pos์™€ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
- ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด ans๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
"""
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        pos = neg = ans = nums[0]
        N = len(nums)

        for i in range(1, N):
            if nums[i] < 0:
                neg, pos = pos, neg

            pos = max(nums[i], nums[i] * pos)
            neg = min(nums[i], nums[i] * neg)

            ans = max(ans, pos)

        return ans
  • ํŒจํ„ด: Dynamic Programming, Two Pointers, Greedy
  • ์„ค๋ช…: ์—ฐ์† ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ๊ณฑ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์–‘์ˆ˜/์Œ์ˆ˜์˜ ๊ณฑ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜๋Š” ๋‹จ์ผ ํŒจ์Šค ํ•ด๋ฒ•์œผ๋กœ, ํ˜„์žฌ ์œ„์น˜์˜ ๊ฐ’๊ณผ ์ด์ „๊นŒ์ง€์˜ ์ตœ๋Œ“๊ฐ’/์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” DP ์„ฑ๊ฒฉ์˜ ์ƒํƒœ ์ „๊ฐœ์™€ ์ด๋ฅผ ์ด์šฉํ•œ ๊ทธ๋ฆฌ๋””์  ์„ ํƒ์ด ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: pos์™€ neg๋ฅผ ๊ฐ๊ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ์–‘์ˆ˜/์Œ์ˆ˜ ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€/์ตœ์†Œ ๊ณฑ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์Œ์ˆ˜์˜ ๋“ฑ์žฅ ์‹œ ๊ตํ™˜์ด ํ•ต์‹ฌ์ด๋‹ค.

๊ฐœ์„  ์ œ์•ˆ: ํŠน์ • ์ž…๋ ฅ์— ๋Œ€ํ•ด nums๊ฐ€ ๋น„์–ด์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•œ ์ž…๋ ฅ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ์ •์„ฑ์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

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

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.

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

minimum-window-substring/alphaorderly.py
"""

์‹œ๊ฐ„๋ณต์žก๋„: O(n)
๊ณต๊ฐ„๋ณต์žก๋„: O(1)

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด s์—์„œ t์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ์†Œ ์œˆ๋„์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค.

Window ํด๋ž˜์Šค๋Š” ํƒ€๊ฒŸ ๋ฌธ์ž์—ด(t)์— ๊ตฌ์„ฑ๋œ ๊ฐ ๋ฌธ์ž๋ณ„ ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๊ณ ,
์œˆ๋„์šฐ ๋‚ด ํ•ด๋‹น ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ˜„์žฌ ์œˆ๋„์šฐ๊ฐ€ ํƒ€๊ฒŸ์„ ๋งŒ์กฑํ•˜๋Š”์ง€(check) ํ™•์ธํ•œ๋‹ค.

add ๋ฉ”์„œ๋“œ๋Š” ์œˆ๋„์šฐ์— ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ ,
  - ํƒ€๊ฒŸ์˜ ๋ฌธ์ž ๊ฐฏ์ˆ˜์™€ ๊ฐ™์•„์ง€๋ฉด key_count๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
remove ๋ฉ”์„œ๋“œ๋Š” ์œˆ๋„์šฐ์—์„œ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.
  - ํƒ€๊ฒŸ์˜ ๋ฌธ์ž ๊ฐฏ์ˆ˜๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด key_count๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

check ๋ฉ”์„œ๋“œ๋Š” ์œˆ๋„์šฐ์— ํƒ€๊ฒŸ ๋ฌธ์ž๊ฐ€ ํ•„์š”ํ•œ ๋งŒํผ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
  - key_count์™€ target_count๊ฐ€ ๊ฐ™์œผ๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
"""
class Window:
    def __init__(self, target: str):
        self.target = Counter(target)
        self.window = defaultdict(int)

        self.key_count = 0
        self.target_count = len(self.target)

    def check(self):
        return self.key_count == self.target_count

    def add(self, ch: str):
        self.window[ch] += 1

        if self.window[ch] == self.target[ch]:
            self.key_count += 1

    def remove(self, ch: str):
        self.window[ch] -= 1
        if self.window[ch] < self.target[ch]:
            self.key_count -= 1


class Solution:
    def minWindow(self, s: str, t: str) -> str:
        window = Window(t)
        left = 0
        ans = (-float("inf"), float("inf"))

        for right, value in enumerate(s):

            window.add(value)
            if not window.check():
                continue

            while window.check():
                window.remove(s[left])
                left += 1

            if ans[1] - ans[0] > right - left:
                ans = (left - 1, right)

        if ans[0] == -float("inf"):
            return ""

        return s[ans[0] : ans[1] + 1]
  • ํŒจํ„ด: Sliding Window
  • ์„ค๋ช…: ์ฃผ์–ด์ง„ ์ฝ”๋“œ๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด ์œˆ๋„์šฐ๋ฅผ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋กœ ์กฐ์ ˆํ•˜๋ฉฐ, ํƒ€๊นƒ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ์†Œ ์œˆ๋„์šฐ๋ฅผ ์ฐพ๋Š” ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ๋‚ด๋ถ€ ๋ฌธ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐ๊ฑด ์ถฉ์กฑ ์‹œ ์œˆ๋„์šฐ๋ฅผ ์ถ•์†Œํ•˜๋Š” ํ๋ฆ„์ด Sliding Window ํŒจํ„ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: Window ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฌธ์ž ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๊ณ  ํ‚ค ์นด์šดํŠธ๋กœ ์œˆ๋„์šฐ๋ฅผ ์ถ•์†Œํ•œ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด ๊ด€๋ฆฌ๋กœ ๊ณต๊ฐ„์„ ์ƒ์ˆ˜๋กœ ์œ ์ง€ํ•œ๋‹ค.

๊ฐœ์„  ์ œ์•ˆ: Window ๊ตฌํ˜„์—์„œ Counter/ defaultdict ์ดˆ๊ธฐํ™” ๋น„์šฉ ๊ณ ๋ ค ์‹œ, ์ •๊ทœ ๋”•์…”๋„ˆ๋ฆฌ ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์žฌ์ ๊ฒ€ํ•ด ์„ฑ๋Šฅ ์—ฌ์ง€๋ฅผ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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.

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

pacific-atlantic-water-flow/alphaorderly.py
"""
์‹œ๊ฐ„๋ณต์žก๋„: O(m * n)
๊ณต๊ฐ„๋ณต์žก๋„: O(m * n)

1. ํƒœํ‰์–‘๊ณผ ๋Œ€์„œ์–‘ ๊ฐ๊ฐ์—์„œ ๋ฌผ์ด ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•  2์ฐจ์› ๋ฐฐ์—ด(check)์„ ๋งŒ๋“ ๋‹ค.
2. ํƒœํ‰์–‘๊ณผ ๋งž๋‹ฟ์€ ์นธ๋“ค(์™ผ์ชฝ ์—ด๊ณผ ์œ„์ชฝ ํ–‰)์—๋Š” ํƒœํ‰์–‘ ๋„๋‹ฌ ๊ฐ€๋Šฅ(๊ฐ’ 1), ๋Œ€์„œ์–‘๊ณผ ๋งž๋‹ฟ์€ ์นธ๋“ค(์˜ค๋ฅธ์ชฝ ์—ด๊ณผ ์•„๋ž˜์ชฝ ํ–‰)์—๋Š” ๋Œ€์„œ์–‘ ๋„๋‹ฌ ๊ฐ€๋Šฅ(๊ฐ’ 2) ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.
   - 1: ํƒœํ‰์–‘, 2: ๋Œ€์„œ์–‘ โ€” 2์ง„์ˆ˜๋กœ๋Š” ๊ฐ๊ฐ 01, 10์ด๋ผ๋Š” ์˜๋ฏธ์ž„.
3. ๊ฐ ๋ฐ”๋‹ค์— ์ธ์ ‘ํ•œ ์นธ๋“ค์—์„œ ์‹œ์ž‘ํ•ด, BFS๋ฅผ ์ด์šฉํ•ด ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์นธ์„ ํ™•์žฅํ•œ๋‹ค.
   - ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ํ•ญ์ƒ ์ง€๊ธˆ ์นธ๋ณด๋‹ค ๋†’์ด๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋†’์€ ์นธ์œผ๋กœ๋งŒ ๋ฌผ์ด ํ๋ฅผ ์ˆ˜ ์žˆ๋‹ค(์ฆ‰, ๋ฌผ์ด ๊ฑฐ์Šฌ๋Ÿฌ ํ๋ฅด๋Š” ์กฐ๊ฑด).
   - ์ด๋ฏธ ๊ฐ™์€ ๋ฐ”๋‹ค์—์„œ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” ์นธ์€ ๊ฑด๋„ˆ๋›ด๋‹ค.
   - ์ƒˆ๋กœ์šด ์œ„์น˜์— ๋„๋‹ฌํ•  ๋•Œ๋งˆ๋‹ค check ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•˜๊ณ  ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
4. ํƒœํ‰์–‘๊ณผ ๋Œ€์„œ์–‘์—์„œ ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์นธ(๊ฐ’์ด 3์ด ๋œ ์นธ)์„ ๋‹ต์œผ๋กœ ๋ชจ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# ๋น„ํŠธ๋งˆ์Šคํ‚น ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์›๋ฆฌ #
- ํƒœํ‰์–‘๊ณผ ๋Œ€์„œ์–‘ ๋‘ ๋ฐ”๋‹ค์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์นธ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ๋งˆ์Šคํ‚น ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
- ๊ฐ ์นธ์— ๋Œ€ํ•ด, 1๋น„ํŠธ(01)๋Š” ํƒœํ‰์–‘(Pacific), 2๋น„ํŠธ(10)๋Š” ๋Œ€์„œ์–‘(Atlantic) ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.
- ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ ์นธ์˜ ๊ฐ’์ด 1์ด๋ฉด ํƒœํ‰์–‘, 2์ด๋ฉด ๋Œ€์„œ์–‘, 3์ด๋ฉด ๋‘ ๋ฐ”๋‹ค ๋ชจ๋‘์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์นธ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
- bfs/dfs๋กœ ์ธ์ ‘ ์นธ(์ƒํ•˜์ขŒ์šฐ)๋กœ ํ™•์žฅํ•  ๋•Œ, ์ด๋ฏธ ํ•ด๋‹น ๋ฐ”๋‹ค์˜ ๋น„ํŠธ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š”๋‹ค.
"""
class Solution:
    def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
        ROW = len(heights)
        COL = len(heights[0])
        DIR = [
            [1, 0],
            [0, 1],
            [-1, 0],
            [0, -1]
        ]

        check = [[0] * COL for _ in range(ROW)]

        for r in range(ROW):
            check[r][0] |= 1
            check[r][COL - 1] |= 2

        for c in range(COL):
            check[0][c] |= 1
            check[ROW - 1][c] |= 2

        queue = deque([])

        for r in range(ROW):
            for c in range(COL):
                if check[r][c] != 0:
                    queue.append((r, c))

        def bound(row: int, col: int) -> bool:
            return 0 <= row < ROW and 0 <= col < COL

        while queue:
            r, c = queue.popleft()

            for dr, dc in DIR:
                tr, tc = r + dr, c + dc

                if not bound(tr, tc):
                    continue

                if heights[tr][tc] < heights[r][c]:
                    continue

                if check[tr][tc] | check[r][c] == check[tr][tc]:
                    continue

                check[tr][tc] |= check[r][c]
                queue.append((tr, tc))

        ans = []

        for r in range(ROW):
            for c in range(COL):
                if check[r][c] == 3:
                    ans.append([r, c])

        return ans
  • ํŒจํ„ด: Breadth-First Search, Dynamic Programming, Hash Map / Hash Set
  • ์„ค๋ช…: ์ฃผ์š” ๋กœ์ง์ด BFS๋ฅผ ์‚ฌ์šฉํ•ด ๋‘ ๋ฐ”๋‹ค๋กœ ์ฐจ๋ก€๋Œ€๋กœ ๋„๋‹ฌ ์—ฌ๋ถ€๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ๊ฐ ์นธ์˜ ์ƒํƒœ๋ฅผ ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋‘ ๋ฐ”๋‹ค์˜ ๋„๋‹ฌ ์—ฌ๋ถ€๋ฅผ ํ•ฉ์ณ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ํŒจํ„ด์ด ๋ณด์ธ๋‹ค. ๋˜ํ•œ ์ƒํƒœ ๊ฐฑ์‹ ๊ณผ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๊ด€๋ฆฌ๊ฐ€ DP์  ์•„์ด๋””์–ด์™€ ๋น„ํŠธ๋งˆ์Šคํ‚น์˜ ํ™œ์šฉ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ๊ฐ ์นธ์— ๋‘ ๋ฐ”๋‹ค ๋„๋‹ฌ ์—ฌ๋ถ€๋ฅผ ๋น„ํŠธ๋กœ ํ‘œ์‹œํ•˜๊ณ , ์–‘ ๋ฐฉํ–ฅ์œผ๋กœ BFS๋ฅผ ํ™•์žฅํ•œ๋‹ค. ์ค‘๋ณต ๋ฐฉ๋ฌธ ์ตœ์†Œํ™”๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.

๊ฐœ์„  ์ œ์•ˆ: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ ์ž ๋น„ํŠธ๋งˆ์Šคํ‚น ๋Œ€์‹  ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ ์ฒดํฌ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ ค ๊ฐ€๋Šฅํ•˜๋‹ค.

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

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.

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

sum-of-two-integers/alphaorderly.py
"""
์‹œ๊ฐ„๋ณต์žก๋„: O(1)
๊ณต๊ฐ„๋ณต์žก๋„: O(1)

16๋น„ํŠธ ์ •์ˆ˜ ๋ฒ”์œ„์—์„œ ๊ฐ ๋น„ํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ ๋ง์…ˆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ฐ ๋น„ํŠธ์˜ ํ•ฉ์€ XOR ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ•˜๊ณ ,
์˜ฌ๋ฆผ์ˆ˜(carry)๋Š” ๋‘ ๋น„ํŠธ ์ด์ƒ์ด 1์ธ ๊ฒฝ์šฐ๋ฅผ OR ์—ฐ์‚ฐ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  - ์ „๊ฐ€์‚ฐ๊ธฐ ์›๋ฆฌ ์ ์šฉ

๊ณ„์‚ฐ๋œ ๊ฐ ๋น„ํŠธ๋Š” ans์˜ ํ•ด๋‹น ์œ„์น˜์— ์ €์žฅํ•œ๋‹ค.

Python์˜ int๋Š” ๊ณ ์ •๋œ ๋น„ํŠธ ํญ์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ,
์ตœ์ข… ๊ฒฐ๊ณผ์˜ ์ตœ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ 1์ธ ๊ฒฝ์šฐ์—๋Š” 16๋น„ํŠธ ์Œ์ˆ˜๋กœ ์ง์ ‘ ๋ณ€ํ™˜ํ•œ๋‹ค.

MASK์™€ XORํ•˜์—ฌ 16๋น„ํŠธ ๋ฒ”์œ„ ์•ˆ์—์„œ ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „ํ•œ ๋’ค,
~ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜์—ฌ Python์˜ ์Œ์ˆ˜ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
"""
class Solution:
    def getSum(self, a: int, b: int) -> int:
        MASK = 0xFFFF
        CHECK = 0x8000

        ans = carry = left = 0
        for i in range(16):
            a_bit = a & 1
            b_bit = b & 1

            left = a_bit ^ b_bit ^ carry
            carry = (a_bit & b_bit) | (b_bit & carry) | (a_bit & carry)

            ans |= left * 2**i
            a >>= 1
            b >>= 1

        if ans & CHECK == 0:
            return ans
        else:
            return ~(MASK ^ ans)
  • ํŒจํ„ด: Bit Manipulation
  • ์„ค๋ช…: ๋‘ ์ •์ˆ˜์˜ ๊ฐ ๋น„ํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ, ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ๋ง์…ˆ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์บ๋ฆฌ์™€ ํ•ฉ์„ ๋น„ํŠธ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 16๋น„ํŠธ ๊ณ ์ • ํญ ๊ฐ€์ •๊ณผ ์ตœ์ข… ๋ถ€ํ˜ธ ์ฒ˜๋ฆฌ๋กœ ๋น„ํŠธ ์กฐ์ž‘ ํŒจํ„ด์ด ํ•ต์‹ฌ์ด๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ: ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ๋ง์…ˆ์˜ ๊ฐ ๋น„ํŠธ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ์ข… ์Œ์ˆ˜ ํ‘œ์‹œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํŒŒ์ด์ฌ์˜ ๊ฐ€๋ณ€ ์ •์ˆ˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

๊ฐœ์„  ์ œ์•ˆ: ์ž…๋ ฅ ์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ , ๋” ํฐ ๋น„ํŠธ ์ˆ˜์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ์ „๋žต๋„ ๊ณ ๋ คํ•ด๋ณผ ๋งŒํ•˜๋‹ค.

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

@alphaorderly

Copy link
Copy Markdown
Contributor Author

๊ทธ ์ปค๋ฐ‹ ๋กœ๊ทธ ์ด์ƒํ•œ๊ฑฐ ์•Œ๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ ์ฝ”๋“œ ๊ฐœ์„ ๋‚ด์šฉ๋ง๊ณ  ๊ทธ๊ฑฐ ์ ์ง€ ๋ง์•„์ฃผ์„ธ์š” ๋‹ค์Œ์ฃผ๋ถ€ํ„ฐ ๊ดœ์ฐฎ์•„์งˆ๊ฒ๋‹ˆ๋‹ค.

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