ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ 7์ฅ - ๋ฐฐ์ด
๋ฌธ์ ๊ฐ ์ ์ฒด์ ์ผ๋ก ์ด๋ ค์์ ํ์ง ๋ชปํ๋ค. ์ผ๋จ ๋ค์ 8์ฅ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๋ฐฐ์ด๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ค์ ํธ๋ ๋ฐ ์๊ฐ์ ์์์ผ๊ฒ ๋ค.
๋ฐฐ์ด์ ๊ฐ ๋๋ ๋ณ์ ์๋ฆฌ๋จผํธ์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋ ๊ตฌ์กฐ๋ก, ํ๋ ์ด์์ ์ธ๋ฑ์ค ๋๋ ํค๋ก ์๋ณ๋๋ค.
๋ ์์ ํฉ
๋ธ๋ฃจํธ ํฌ์ค ๋ฐฉ์์ผ๋ก ํ์๋ค. ๋น์ทํ๊ฒ ํ์ด์ ๋ฐ๋ก ์ ์ง๋ ์์์
ํ์ด1. ๋ธ๋ฃจํธ ํฌ์ค๋ก ๊ณ์ฐ
์๊ฐ ๋ณต์ก๋ → O(n^2)
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
ํ์ด2. in์ ์ด์ฉํ ํ์
๋ชจ๋ ์กฐํฉ์ ๋น๊ตํ์ง ์๊ณ ํ๊ฒ์์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋บ ๊ฐ tartget - n ์ด ์กด์ฌํ๋์ง ํ์ํ๋ ๋ฐฉ์์ผ๋ก ํ ์ ์์
์๊ฐ ๋ณต์ก๋ → O(n^2)์ด์ง๋ง ๊ฐ์ ์๊ฐ ๋ณต์ก๋๋ผ๋ in ์ฐ์ฐ ์ชฝ์ด ํจ์ฌ ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฆ
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i, n in enumerate(nums):
complement = target - n
if complement in nums[i + 1:]:
return nums.index(n), nums[i+1:].index(complement) + (i+1)
ํ์ด3. ์ฒซ ๋ฒ์งธ ์๋ฅผ ๋บ ๊ฒฐ๊ณผ ํค ์กฐํ
์๊ฐ ๋ณต์ก๋ → O(n)
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
# ํค์ ๊ฐ์ ๋ฐ๊ฟ์ ๋์
๋๋ฆฌ๋ก ์ ์ฅ
for i, num in enumerate(nums):
nums_map[num] = i
# ํ๊ฒ์์ ์ฒซ ๋ฒ์งธ ์๋ฅผ ๋บ ๊ฒฐ๊ณผ๋ฅผ ํค๋ก ์กฐํ
for i, num in enumerate(nums):
if target - num in nums_map and i != nums_map[target - num]:
return nums.index(num), nums_map[tartget - num]
ํ์ด4. ์กฐํ ๊ตฌ์กฐ ๊ฐ์
์ ์ฒด๋ฅผ ๋ชจ๋ ์ ์ฅํ ํ์ ์์ด ์ ๋ต์ ์ฐพ๊ฒ ๋๋ฉด ํจ์๋ฅผ ๋ฐ๋ก ๋น ์ ธ๋์ฌ ์ ์์. ๊ทธ๋ฌ๋ ๋ ๋ฒ์งธ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ด์ฐจํผ ๋งค๋ฒ ๋น๊ตํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ํ์ด์ ๋นํด ์ฑ๋ฅ์์ ํฐ ์ด์ ์ ์์ ๊ฑฐ ๊ฐ์
์๊ฐ ๋ณต์ก๋ → O(n)
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
# ํ๋์ for ๋ฌธ์ผ๋ก ํตํฉ
for i, num in enumerate(nums):
if target - num in nums_map:
return [nums_map[target-num], i]
nums_map[num] = i
ํ์ด5. ํฌ ํฌ์ธํฐ ์ด์ฉ
ํฌ ํฌ์ธํฐ๋ ์ผ์ชฝ ํฌ์ธํฐ์ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ์ ํฉ์ด ํ๊ฒ๋ณด๋ค ํฌ๋ค๋ฉด ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ผ์ชฝ์ผ๋ก, ์๋ค๋ฉด ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ฉด์ ๊ฐ์ ์กฐ์ ํ๋ ๋ฐฉ์
ํฌ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ ํ ์ ์๋ ๋ฌธ์
ํ์ด6. ๊ณ (Go) ๊ตฌํ
์ฑ๋ฅ ๊ฐ์ ์ ํจ๊ณผ๊ฐ ํฌ์ง๋ง, ํด๋น ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ค ๋ชฐ๋ผ์ ์ ์ง ์์์
๋น๋ฌผ ํธ๋ํ
๋น๋ฌผ ํธ๋ํ๊ณผ ๋น์ทํ ์ ํ์ ๋ฌธ์ (์ ๋ง๋๊ธฐ)๋ฅผ ์ ๋ชป ํธ๋ ํธ์ด๋ผ์... ์ผ๋จ ์ด๋ฒ์๋ ํ์ด๋ฅผ ๋จธ๋ฆฌ์ ๋ด์๋๋ ๊ฑธ๋ก ๋์ด๊ฐ๋ค.
ํ์ด1. ํฌ ํฌ์ธํฐ๋ฅผ ์ต๋๋ก ์ด๋
์๊ฐ ๋ณต์ก๋ → O(n)
def trap(self, height: List[int]) -> int:
if not height:
return 0
volume = 0
left, right = 0, len(height) - 1
left_max, right_max = height[left], height[right]
while left < right:
left_max, right_max = max(height[left], left_max),
max(height[right], right_max)
# ๋ ๋์ ์ชฝ์ ํฅํด ํฌ ํฌ์ธํฐ ์ด๋
if left_max <= right_max:
volume += left_max - height[left]
left += 1
else:
volume += right_max - height[right]
right -= 1
return volume
ํ์ด2. ์คํ ์๊ธฐ
์๊ฐ ๋ณต์ก๋ → O(n)
def trap(self, height: List[int]) -> int:
stack = []
volume = 0
for i in range(len(height)):
# ๋ณ๊ณก์ ์ ๋ง๋๋ ๊ฒฝ์ฐ
while stack and height[i] > height[stack[-1]]:
# ์คํ์์ ๊บผ๋
top = stack.pop()
if not len(stack):
break
# ์ด์ ๊ณผ์ ์ฐจ์ด๋งํผ ๋ฌผ ๋์ด ์ฒ๋ฆฌ
distance = i - stack[-1] - 1
waters = min(height[i], height[stack[-1]]) - height[top]
volume += distance * waters
stack.append(i)
return volume
์ธ ์์ ํฉ
์ด ๋ฌธ์ ๋ ๋ด๋ ์.. ์ ๋ชจ๋ฅด๊ฒ ๋ค. ๋ค์์ ํ ๋ฒ ๋ ๋ณด๊ธฐ
ํ์ด1. ๋ธ๋ฃจํธ ํฌ์ค๋ก ๊ณ์ฐ
์๊ฐ ๋ณต์ก๋ → O(n^3)
def threeSum(self, nums: List[int]) -> List[List[int]]:
results = []
nums.sort()
# ๋ธ๋ฃจํธ ํฌ์ค n^3 ๋ฐ๋ณต
for i in range(len(nums) - 2):
# ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i+1, len(nums)-1):
if j > i + 1 and nums[j] == nums[j-1]:
continue
for k in range(j+1, len(nums)):
if k > j + 1 and nums[k] == nums[k-1]:
continue
if nums[i] + nums[j] + nums[k] == 0:
results.append((nums[i], nums[j], nums[k]))
return results
ํ์ด2. ํฌ ํฌ์ธํฐ๋ก ํฉ ๊ณ์ฐ
์๊ฐ ๋ณต์ก๋ → O(n^2)
def threeSum(self, nums: List[int]) -> List[List[int]]:
results = []
nums.sort()
for i in range(len(nums) - 2):
# ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ
if i > 0 and nums[i] == nums[i - 1]:
continue
# ๊ฐ๊ฒฉ์ ์ขํ๊ฐ๋ฉฐ ํฉ sum ๊ณ์ฐ
left, right = i+1, len(nums) - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum < 0:
left += 1
elif sum > 0:
right -= 1
else:
# sum = 0์ธ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ ๋ต ๋ฐ ์คํต ์ฒ๋ฆฌ
results.append((nums[i], nums[left], nums[right]))
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return results
๋ฐฐ์ด ํํฐ์ I
๋ด๊ฐ ์์ฑํ ์ฝ๋
def arrayPairSum(self, nums: List[int]) -> int:
nums.sort()
sum = 0
for i in range(len(nums)):
if i % 2 == 0:
sum += nums[i]
return sum
ํ์ด1. ์ค๋ฆ์ฐจ์ ํ์ด
def arrayPairSum(self, nums: List[int]) -> int:
sum = 0
pair = []
nums.sort()
for n in nums:
# ์์์๋ถํฐ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ด๋ฅผ ๋ง๋ค์ด์ ํฉ ๊ณ์ฐ
pair.append(n)
if len(pair) == 2:
sum += min(pair)
pair = []
return sum
ํ์ด2. ์ง์ ๋ฒ์งธ ๊ฐ ๊ณ์ฐ
def arrayPairSum(self, nums: List[int]) -> int:
sum = 0
nums.sort()
for i, n in enumerate(nums):
if i % 2 == 0:
sum += n
return sum
ํ์ด3. ํ์ด์ฌ๋ค์ด ๋ฐฉ์
def arrayPairSum(self, nums: List[int]) -> int:
return sum(sorted(nums)[::2])
์์ ์ ์ ์ธํ ๋ฐฐ์ด์ ๊ณฑ
๋ด๊ฐ ์์ฑํ ์ฝ๋
์ด ์ฝ๋๋ ์๊ฐ ์ด๊ณผ๋ก ์คํจ๊ฐ ๋ฌ๋ค. ๋ค์ด์ค๋ ๊ฐ์ด
[-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1...
์ด ์ ๋๋ก ๊ธธ ๋ ์คํจํ๋ค. ๐ข
def productExceptSelf(self, nums: List[int]) -> List[int]:
output = []
for i, n in enumerate(nums):
output.append(reduce((lambda x, y: x * y), nums[:i] + nums[i+1:]))
return output
ํ์ด1. ์ผ์ชฝ ๊ณฑ์ ๊ฒฐ๊ณผ์ ์ค๋ฅธ์ชฝ ๊ฐ์ ์ฐจ๋ก๋๋ก ๊ณฑ์
def productExceptSelf(self, nums: List[int]) -> List[int]:
out = []
p = 1
# ์ผ์ชฝ ๊ณฑ์
for i in range(0, len(nums)):
out.append(p)
p = p * nums[i]
p = 1
# ์ผ์ชฝ ๊ณฑ์
๊ฒฐ๊ณผ์ ์ค๋ฅธ์ชฝ ๊ฐ์ ์ฐจ๋ก๋๋ก ๊ณฑ์
for i in range(len(nums)-1, 0 - 1, -1):
out[i] = out[i] * p
p = p * nums[i]
return out
์ฃผ์์ ์ฌ๊ณ ํ๊ธฐ ๊ฐ์ฅ ์ข์ ์์
ํ์ด1. ๋ธ๋ฃจํธ ํฌ์ค๋ก ๊ณ์ฐ
์๊ฐ ๋ณต์ก๋ → O(n^2)
def maxProfit(self, prices: List[int]) -> int:
max_price = 0
for i, price in enumerate(prices):
for j in range(i, len(prices))):
max_price = max(prices[j] - price, max_price)
return max_price
ํ์ด2. ์ ์ ๊ณผ ํ์ฌ ๊ฐ๊ณผ์ ์ฐจ์ด ๊ณ์ฐ
์๊ฐ ๋ณต์ก๋ → O(n)
def maxProfit(self, prices: List[int]) -> int:
profit = 0
min_price = sys.maxsize
# ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ณ์ ๊ฐฑ์
for price in prices:
min_price = min(min_price, price)
profit = max(profit, price - min_price)
return profit
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote