leetcode์์ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ํฌ ํฌ์ธํฐ(์ฌ๋ผ์ด๋ฉ ์๋์ฐ) ๊ธฐ๋ฒ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์๊ณ ์ด์ ๋ํ ๊ฐ๋ ์ ํ์คํ๊ฒ ๋ค์ง๊ณ ์ ์ด๋ ๊ฒ ๊ธ์ ์ ๋๋ค..!
์ฐ์ , ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ํจ์จ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ฃผ๋ก ๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๊ฐ์ ์ฒ๋ฆฌํ  ๋ ์ ์ฉํ๋ฉฐ, O(n) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ฌธ์ ์์ ์ต์ ํ๋ ํด๋ฒ์ ์ ์ํ  ์ ์๋ค๊ณ  ํ๋ค.
ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ๋ง ๊ทธ๋๋ก ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ด๋ค. ์ด ํฌ์ธํฐ๋ค์ ์ฃผ๋ก ๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ํ์ ๋ฒ์๋ฅผ ์ขํ๊ฑฐ๋, ๊ฐ์ ์ถ์ ํ๋ ์ญํ ์ ํ๋ค.
์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ ์ฃผ๋ก ๋ฒ์๊ฐ ์ ํด์ง ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ฉฐ, ํ๋์ ํฌ์ธํฐ๋ ๋ฒ์์ ์์์, ๋ค๋ฅธ ํ๋๋ ๋ฒ์์ ๋์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ฅผ ํตํด ํจ์จ์ ์ธ ํ์์ ํ ์ ์๋ค.
์ ์ ๋ฐฐ์ด nums์ ์ ์ target์ด ์ฃผ์ด์ง๋๋ค. ๋ฐฐ์ด์์ ๋ ์๋ฅผ ๋ํ ๊ฐ์ด target์ด ๋๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ์ ๋๋ค. ๊ฐ ์ ๋ ฅ์ ๋ํด ์ ๋ต์ ์ ์ผํฉ๋๋ค.
nums = [2, 7, 11, 15], target = 9
Input: 9 2 7 11 15
Output: [0, 1]
์ด ๋ฌธ์ ๋ ๋ ์์ ํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. nums์ ๋ฐฐ์ด์์ ๋ ์์ ํฉ์ด target์ด ๋๋๋ก ํ๋ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก, ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ ํ ํฌ์ธํฐ๋ ๋ฐฐ์ด์ ๋งจ ์, ๋ค๋ฅธ ํฌ์ธํฐ๋ ๋ฐฐ์ด์ ๋งจ ๋์์ ์์ํ๋ฉฐ ๊ฐ๋ฆฌํค๋ ํฉ์ด target๊ณผ ์ผ์นํ๋ฉด return ํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
ํต์ฌ์, ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ํฉ์ด 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)
์ด์ ๊ฐ์ด ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ฐ ์๋์ ์ฅ์ ์ ์ ๋ฆฌํด๋ณด์๋ค.
์ผ๋ฐ์ ์ผ๋ก, ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์์ ๋ฌธ์ ๋ฅผ ํ ๋ ์ฌ๋ฌ ๋ฒ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ์ง๋ง ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ํ ๋ฒ๋ง ์ํํด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ฅผ O(n) ์ผ๋ก ์ค์ผ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์์ ๋ ์์ ํฉ ๋ฌธ์ ์์๋ ๋ฐฐ์ด์ ํ ๋ฒ๋ง ์ํํ๊ณ , ๊ฐ ๊ฐ์ ํ ๋ฒ๋ง ๋น๊ตํ๋ฉด์ ํด๋ต์ ์ฐพ์ ์ ์์์ ์ ์ ์๋ค.
ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ O(1) ์ ์ถ๊ฐ ๊ณต๊ฐ๋ง ํ์๋ก ํ๋ค. ๋ณ๋์ ์ถ๊ฐ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ ํฌ์ธํฐ๋ง์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
์ด์ธ์๋ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ณ ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์๋ค๋ ์ ๊ณผ ํ์ ๋ฒ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฌธ์์ด ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ํ์ฉํ ์ ์๋ค๋ ์  ๋ํ ์ฅ์ ์ด๋ค!
ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ํฐ ๋์์ด ๋๋ค๋ ๊ฒ์ ์์๋ค. ํนํ ๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๋ฒ์๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ๊ฐ์ ์ถ์ ํ ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, O(n) ์๊ฐ ๋ณต์ก๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฏ๋ก ๋ค์ํ ํ์ฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ ์ฉํด ๋๊ฐ๋ฉด, ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ฏ๋ก ๋ง์ ๋ฌธ์ ๋ฅผ ์ ํ๋ฉด์ ์ ์ฉํด๋ด์ผ๊ฒ ๋ค!
์ฐธ๊ณ ๋ก ํฌ ํฌ์ธํฐ์ ๊ด๋ จํ์ฌ ์ด ๊ธ์ ์ ๊ฒ ๋ leetcode 19 "Remove Nth Node From End of List" ๋ฌธ์ ์ ๋ํด์๋ ๋ค์ ๊ฒ์๋ฌผ์ ์ ๋ฆฌํด๋์๋ค.