๋ฌธ์ ๋งํฌ
https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/
1์ฐจ ํ์ด
๋จ์ํ๊ฒ ๋ชจ๋ ์กฐํฉ์ ๋น๊ตํ๋ฉด O(n*n)์ด ๊ฑธ๋ฆฌ์ง๋ง, ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์๊ฒ ๊ฐ์๋ค.
์ ์ฝ์กฐ๊ฑด์ n์ด 30000 ๊ฐ์ด๋ฏ๋ก ์ต๋ 30000 * 30000 ํด์ ๊ทธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๊ทผํ๋ฉด ์๋ ๊ฒ ๊ฐ์์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๋ค.
๊ทธ๋ค์ ์๊ฐํ๋ ๋ฐฉ์์, target๊ณผ ํ์ฌ ๊ฐ์ ๋น๊ตํด์, binary search๋ฅผ ํ์ฉํด์ ์ค๊ฐ๊ฐ๋ถํฐ ํด์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ดค๋๋ฐ,
[-90, 1, 10, 100] ์ด ์์๋ target=10์ด๋ผ๊ณ ํ์๋ ๋ต์ [100,-90]์ด๊ธฐ ๋๋ฌธ์ binary search๋ก target๊ณผ ๊ทผ์ฌ๊ฐ 10์ ์ฐพ๋๋ผ๋ ํด๊ฒฐ์ฑ ์ด ์๋ ์๋ ์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ ํ๋ค.
๊ทธ๋์ ๊ฐ ๋ฐฐ์ด์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์๋ ๊ฒ์ ํํธ๋ก ์๊ณ ๋ฆฌ์ฆ์ผ๋ก์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ธฐ ์์ํ๋ค.
์ฃผ์ด์ง ์์, [2,7,11,15]์์ ํฉ 18์ ๊ตฌํ๋ค๊ณ ํ์๋,
- 15 ์ ํ, 15 + 2 = 17 < 18 ๋ค์๊ฑฐ ๊ณ์ฐ, 15 + 7 = 22 ๋ฉ์ถค
- 11 ์ ํ, 11 + 7 = 18 ์ข ๋ฃ ์ด๋ฐ์์ผ๋ก ๋๋ค.
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ target๊ณผ ๋น๊ตํด์ ๋์ด๊ฐ ๊ฒฝ์ฐ, ๋์ด์ ๋ค์ ๊ฐ์ ๋ณผ ํ์๊ฐ ์๋ค.
- ๋ฐ๋๋ก 2์ ํ, 2 + 7 = 9, 2 + 11 = 13, 2 + 15 = 17 target์ ์ฐพ์๋๊น์ง ๊ณ์ ๋ด์ผํ๊ณ
- 7 ์ ํ, 7 + 11 = 18 ์ข ๋ฃ ์ด๋ฐ์์ผ๋ก ๋๋ค.
์ด ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ง๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
l, r = 0, len(numbers) - 1
while l < r:
if (numbers[l] + numbers[r]) == target :
break;
elif (numbers[l] + numbers[r]) > target :
r = r -1
elif (numbers[l] + numbers[r]) < target :
l = l + 1
return [l + 1, r + 1]
ํด์ค
https://www.youtube.com/watch?v=cQ1Oz4ckceM
์์ ๋ฌธ์ ํ์์๋, ์๊ฐํ๋ ๊ฐ๋ ์ ํด์ค์์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ์ค๋ช ํด์ ๊ฐ์ ธ์ค์๋ฉด,
[1,3,4,5,7,11]์ด ์๊ณ target=9์ธ ๊ฒฝ์ฐ,
๋จผ์ 1 + 11 = 13 < 9 ์ธ๊ฒฝ์ฐ ํฌ์ธํฐ๋ก ํฉ์ ์ค์ผ๋ ค๋ฉด ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์์ชฝ์ผ๋ก ํ ์นธ ๋ก๊ฒจ์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด 1 + 7 = 8 > 9 ๋ก ์คํ๋ ค ๊ฐ์ด target๋ณด๋ค ์ค์ด๋ค์ด์, ์ด์ ๋ ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ๋๋ ค์ผ ํ๋ค.
์ด๋ฐ์์ผ๋ก ์๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์๋ค๊ณ ํ๋ค.