๐Ÿชขํˆฌ ํฌ์ธํ„ฐ ํ™œ์šฉํ•˜๊ธฐ

hannahยท2024๋…„ 12์›” 30์ผ
0

algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
12/16

leetcode์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ํˆฌ ํฌ์ธํ„ฐ(์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ) ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ํ™•์‹คํ•˜๊ฒŒ ๋‹ค์ง€๊ณ ์ž ์ด๋ ‡๊ฒŒ ๊ธ€์„ ์ ๋Š”๋‹ค..!

์šฐ์„ , ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์€ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ ํšจ์œจ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์ฃผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ œ์—์„œ ์ตœ์ ํ™”๋œ ํ•ด๋ฒ•์„ ์ œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

1. ํˆฌ ํฌ์ธํ„ฐ(์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ)๋ž€?

ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์€ ๋ง ๊ทธ๋Œ€๋กœ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ด ํฌ์ธํ„ฐ๋“ค์€ ์ฃผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ฑฐ๋‚˜, ๊ฐ’์„ ์ถ”์ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” ์ฃผ๋กœ ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง„ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋ฒ”์œ„์˜ ์‹œ์ž‘์„, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฒ”์œ„์˜ ๋์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ธ ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

๋ฌธ์ œ 1: "๋‘ ์ˆ˜์˜ ํ•ฉ"

๋ฌธ์ œ ์„ค๋ช…

์ •์ˆ˜ ๋ฐฐ์—ด nums์™€ ์ •์ˆ˜ target์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—์„œ ๋‘ ์ˆ˜๋ฅผ ๋”ํ•œ ๊ฐ’์ด target์ด ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ •๋‹ต์€ ์œ ์ผํ•ฉ๋‹ˆ๋‹ค.

nums = [2, 7, 11, 15], target = 9

Input: 9 2 7 11 15
Output: [0, 1]

๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. nums์˜ ๋ฐฐ์—ด์—์„œ ๋‘ ์ˆ˜์˜ ํ•ฉ์ด target์ด ๋˜๋„๋ก ํ•˜๋Š” ๋‘ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ, ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•œ ํฌ์ธํ„ฐ๋Š” ๋ฐฐ์—ด์˜ ๋งจ ์•ž, ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋Š” ๋ฐฐ์—ด์˜ ๋งจ ๋์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ฉ์ด target๊ณผ ์ผ์น˜ํ•˜๋ฉด return ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ต์‹ฌ์€, ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์˜ ํ•ฉ์ด target๊ณผ ๋น„๊ตํ•˜๋ฉด์„œ

  • ํ•ฉ์ด target๋ณด๋‹ค ์ž‘์œผ๋ฉด, ์ฒซ ๋ฒˆ์งธ ํฌ์ธํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œ์ผœ ํ•ฉ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ํ•ฉ์ด target๋ณด๋‹ค ํฌ๋ฉด, ๋‘ ๋ฒˆ์งธ ํฌ์ธํ„ฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œ์ผœ ํ•ฉ์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
    ํฌ์ธํ„ฐ๊ฐ€ ์„œ๋กœ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค..!

์œ„์˜ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด,

# ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ์ฐพ๋Š” ํ•จ์ˆ˜
def twoSum(nums, target):
    left, right = 0, len(nums) - 1  # ํฌ์ธํ„ฐ ์ดˆ๊ธฐํ™”
    
    # ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ํ›„ ๋‘ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉ
    nums_sorted = sorted((num, i) for i, num in enumerate(nums))  # ๊ฐ’๊ณผ ์ธ๋ฑ์Šค๋ฅผ ๋ฌถ์–ด ์ •๋ ฌ
    
    while left < right:
        current_sum = nums_sorted[left][0] + nums_sorted[right][0]
        
        if current_sum == target:
            return [nums_sorted[left][1], nums_sorted[right][1]]  # ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜
        elif current_sum < target:
            left += 1  # ํ•ฉ์ด ์ž‘์œผ๋ฉด left ํฌ์ธํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
        else:
            right -= 1  # ํ•ฉ์ด ํฌ๋ฉด right ํฌ์ธํ„ฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
    
    return []  # ๋‹ต์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜

# ์ž…๋ ฅ ๋ฐ›๊ธฐ
nums_input = input().split()
target = int(nums_input[0])  # target
nums = list(map(int, nums_input[1:]))  # nums ๋ฆฌ์ŠคํŠธ

# ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ์ฐพ๊ณ  ๊ฒฐ๊ณผ ์ถœ๋ ฅ
result = twoSum(nums, target)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(result)

์ด์™€ ๊ฐ™์ด ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์•„๋ž˜์— ์žฅ์ ์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

3. ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์˜ ์žฅ์ 

1) ํšจ์œจ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„(O(n))

์ผ๋ฐ˜์ ์œผ๋กœ, ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•ด๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(n) ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๋‘ ์ˆ˜์˜ ํ•ฉ ๋ฌธ์ œ์—์„œ๋„ ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๊ณ , ๊ฐ ๊ฐ’์„ ํ•œ ๋ฒˆ๋งŒ ๋น„๊ตํ•˜๋ฉด์„œ ํ•ด๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2) ๊ณต๊ฐ„ ๋ณต์žก๋„ ์ ˆ์•ฝ(O(1))

ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์€ O(1) ์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„๋งŒ ํ•„์š”๋กœ ํ•œ๋‹ค. ๋ณ„๋„์˜ ์ถ”๊ฐ€์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋‘ ํฌ์ธํ„ฐ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด์™ธ์—๋„ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋ฌธ์ž์—ด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ๋˜ํ•œ ์žฅ์ ์ด๋‹ค!

4. ๊ฒฐ๋ก 

ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ํฐ ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ํŠนํžˆ ๋ฐฐ์—ด์ด๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฒ”์œ„๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ์ถ”์ ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ํ™œ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์ ์šฉํ•ด ๋‚˜๊ฐ€๋ฉด, ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ ‘ํ•˜๋ฉด์„œ ์ ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค!


์ฐธ๊ณ ๋กœ ํˆฌ ํฌ์ธํ„ฐ์™€ ๊ด€๋ จํ•˜์—ฌ ์ด ๊ธ€์„ ์ ๊ฒŒ ๋œ leetcode 19 "Remove Nth Node From End of List" ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์— ์ •๋ฆฌํ•ด๋†“์•˜๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€