0054. Spiral Matrix / 0739. Daily Temperatures
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
e,s,w,n = [0,1], [1,0], [0,-1], [-1,0]
output = []
rows, cols = len(matrix), len(matrix[0])
visited = [[False] * cols for _ in range(rows)]
cnt = 0
x, y = 0,0
dirs = [e,s,w,n]
dir_i = 0
while True:
visited[x][y] = True
output.append(matrix[x][y])
cnt+=1
if cnt == rows*cols:
break
nx,ny = x+dirs[dir_i][0], y+dirs[dir_i][1]
#as it goes
if 0<=nx<rows and 0<=ny<cols:
if not visited[nx][ny]:
x,y=nx,ny
continue
#change dir
dir_i += 1
if dir_i == 4: dir_i = 0
nx,ny = x+dirs[dir_i][0], y+dirs[dir_i][1]
x,y=nx,ny
continue
return output
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack = [(temperatures[0],0)]
answer = [0]*(len(temperatures))
for x in range(1,len(temperatures)):
temp = temperatures[x]
while stack:
if stack[-1][0] < temp:
popped = stack.pop()
answer[popped[1]] = (x-popped[1])
else:
break
stack.append((temp,x))
return answer
๐ง๐ป๐ป 0054) ์ ํ์ ์ธ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ . ๋ฐฉํฅ ๋ฒกํฐ ๋ / ๋จ / ์ / ๋ถ ๊ฐ๊ฐ ๋ง๋ค๊ณ , dirs ๋ฆฌ์คํธ ๋ง๋ค์ด ๋ฃ๋๋ค. ๋ฐฉํฅ ๋ฐ๊พธ๋ ์กฐ๊ฑด (1) ๋ฐฐ์ด์ ๋๊น์ง ๋ฟ๋ ๊ฒฝ์ฐ + (2) ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ: ์ด 2๊ฐ์ง ์กฐ๊ฑด๋ง ๋ง์กฑํ์ง ์๋๋ค๋ฉด x,y update / ๊ทธ๋ ์ง ์๋๋ค๋ฉด dir ๋ฐฉํฅ ๋ฐ๊ฟ์ ํ์ธ.
๐ง๐ป๐ป 0739) ๊ฐ์ํ๋ monotonic stack์ ์ ์งํ๋ฉฐ answer updateํ๋ monotonic stack ์ ํ
: ํ์ฌ ์์น์์ ์ดํ ์์ ์ค ์ฒ์์ผ๋ก ์ฆ๊ฐํ๋ ์จ๋๊ฐ ์์ ๋ ๊ทธ ์ฌ์ด์ ๋ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . ๊ทธ๋ฌ๋ฉด ์ฆ๊ฐ์ธ์ง ์์๋ณด๋ ์์์, ๋ ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด ๊ฐ ์์์ index ์ ๋ณด๊น์ง 2๊ฐ์ ์ ๋ณด๋ฅผ tuple๋ก ์ ์ฅํด ๊ตฌํํ๋ ์ ํ์ ์๊ฐํด์ผ ํ๋ค. ์ฆ๊ฐ์ผ ๊ฒฝ์ฐ ๊ทธ ์์ ์์๋ค(while stack)์์ ๋ฃ๊ณ ์ ํ๋ ์์๋ณด๋ค ์์ ์ซ์๊ฐ ํฌํจ๋ ์์๋ฅผ ๋ชจ๋ ์ฐจ๋ก๋๋ก ๋นผ์ index๊ฐ ์ฐจ์ด๋ก ๋ ์๋ฅผ answer์ update. ๊ฒฐ๋ก ์ ์ผ๋ก ์จ๋๊ฐ ๊ฐ์ํ๊ฒ๋ ์ ์งํ๊ฒ ๋ง๋๋ monotonic stack ์ ํ
0199. Binary Tree Right Side View / 0031. Next Permutation
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
ans = []
queue = deque()
queue.append(root)
while queue:
qLen = len(queue)
level = []
for i in range(qLen):
node = queue.popleft()
if node:
level.append(node.val)
queue.append(node.left)
queue.append(node.right)
if level:
ans.append(level[-1])
return ans
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
l=len(nums)
i=l-2
#find the pivot
while i>=0 and nums[i]>=nums[i+1]:
i-=1
if i>=0: #if pivot, swap
j=l-1
while nums[j]<=nums[i]: #find the rigthmost successor
j-=1
nums[i],nums[j] = nums[j],nums[i] #swap
nums[i+1:] = reversed(nums[i+1:]) #reverse the suffix
return nums
else:
#if no pivot
#rearranged as the lowest possible order
#(i.e., sorted in ascending order).
nums = nums.sort()
return nums
๐ง๐ป๐ป 0199) tree์ ๊ฐ level ๋ณ ๋งจ ์ค๋ฅธ์ชฝ node์ val์ ๋ชจ์ ๋ ans update. BFS๋ก root๋ถํฐ ์์ํด ์ฐจ๋ก๋๋ก ๋ด๋ ค๊ฐ๋ฉด์ queue์ ๊ฐ์๊ฐ ๊ณง ํ์ฌ์ level๋ด์ node ๊ฐ์์ด๋ฏ๋ก(null ํฌํจ), popleft() ์งํ ํ if node์ผ ๋๋ง level์ ์ค์ value ๋ฃ๊ธฐ. ํ level์ด ๋ชจ๋ ๋๋๋ฉด level list์ ๋ฌด์ธ๊ฐ ์กด์ฌํ๋ค๋ฉด level[-1] appendํด์ ๋์ ๊ฒฐ๊ณผ ans ์ถ๋ ฅ
๐ง๐ป๐ป0031) ์ ๋ช ํ ์กฐํฉ๋ก <next permutation> ๋ฌธ์ . ๋ณ๋ ํฌ์คํ ์ฐธ์กฐ
0438. Find All Anagrams in a String / 0036. Valud Sudoku
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
from collections import Counter, defaultdict
freq = dict(Counter(p))
length = len(p)
cur_freq = defaultdict(int)
ans = []
bf = 0
for i in range(len(s)):
cur_freq[s[i]] += 1
if i == (length -1):
if freq == cur_freq:
ans.append(i-len(p)+1)
elif length <= i:
cur_freq[s[bf]] -= 1
if cur_freq[s[bf]] == 0:
del cur_freq[s[bf]]
bf+=1
if freq == cur_freq:
ans.append(i-len(p)+1)
return ans
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
import collections
cols = collections.defaultdict(set)
rows = collections.defaultdict(set)
squares = collections.defaultdict(set)
for r in range(9):
for c in range(9):
if board[r][c] == ".":
continue
if (board[r][c] in rows[r] or board[r][c] in cols[c] or board[r][c] in squares[(r//3, c//3)]):
return False
cols[c].add(board[r][c])
rows[r].add(board[r][c])
squares[(r//3, c//3)].add(board[r][c])
return True
๐ง๐ป๐ป 0438) sliding window ๊ธฐ๋ฒ์ผ๋ก ํ์ฌ index๋ถํฐ p length๊น์ง cur_freq dict updateํ๋ค๊ฐ, p length index๋ถํฐ ๋งจ ์ ๋ฌธ์ ๋น๋์ 1 ๊ฐ์ ๋ฐ ๋งจ ์ค๋ฅธ์ชฝ ๋ฌธ์ ๋น๋์ 1๋ง ์ฆ๊ฐ์ํด์ผ๋ก์จ O(N)์ผ๋ก cur_freq dict updateํ๋ฉฐ ์๋ freq์ ๋น๊ตํ๋ฉฐ ๋ง์ ๋ index update.
๐ง๐ป๐ป 0036) ๊ฐ row์ col์ ๋ค์ด๊ฐ ์ซ์ set๋ก ๋ง๋ค์ด์ rows์ cols dictionary ๋ง๋ค๊ธฐ. ์ถ๊ฐ๋ก squares๋ผ๋ set๊ฐ ๋ค์ด๊ฐ dictionary ๋ง๋ค์ด์ squares๋ update. squares๋ ํ์ฌ (r,c)์์ index ๊ธฐ์ค squares์ (r//3,c//3)์ ์ซ์๋ฅผ ๋ฃ๋๋ค.(9x9 ์ ์ฌ๊ฐํ ๋ด์์ 3x3 ์ ์ฌ๊ฐํ ์์ญ)
0113. Path Sum II / 0189. Rotate Array
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
ans = []
def dfs(node, l):
if not node.left and not node.right: #if this is a leaf node
if sum(l) == targetSum:
ans.append(l[:])
else: #if this is not a leaf node
if node.left:
l.append(node.left.val)
dfs(node.left,l)
l.pop()
if node.right:
l.append(node.right.val)
dfs(node.right,l)
l.pop()
if root:
dfs(root, [root.val])
return ans
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k%=(len(nums))
#reverse
l,r = 0,len(nums)-1
while l<=r:
nums[l], nums[r] = nums[r], nums[l]
l+=1
r-=1
#reverse first kth array
l,r = 0,k-1
while l<=r:
nums[l], nums[r] = nums[r], nums[l]
l+=1
r-=1
#reverse (k+1)th to the last-th array
l,r = k,len(nums)-1
while l<=r:
nums[l], nums[r] = nums[r], nums[l]
l+=1
r-=1
return nums
๐ง๐ป๐ป 0113) Easy Version 0112. Path Sum I๊ณผ ๋์ผ ๋ฌธ์ . ๋ค๋ง, leaf node๊น์ง์ ๊ฒฝ๋ก์ ํฉ์ด ๋ชจ๋ targetSumํ๊ณ ๊ฐ์ ๋์ ๊ฒฝ๋ก ๊ณ์ ans์ update. ์ ํ์ ์ธ dfs backtracking ์งํ
* dfs(node, l) ์งํ
โ return ์กฐ๊ฑด) ํด๋น node๊ฐ leaf node๋ผ๋ฉด, ๋ง์ฝ sum(l) == targetSum์ผ ๊ฒฝ์ฐ list l ๋ด์ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ans list์ ๊ทธ๋๋ก update
โก leaf node๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น node์ left node / right node์ ๊ฐ๊ฐ value๊ฐ ์๊ณ ์์ ๊ฒฝ์ฐ ํ์ธํด dfs(node.left, l) / dfs(node.right, l) ๊ฐ๊ฐ ์งํ
: ๋์ผ ํจ์ ์ ๋ด์ฉ์ l.append() / ์ดํ์ l.pop()์ผ๋ก ์ ๋ค ์ํฉ backtracking ์ ํ์ ๋ง๊ฒ ๊ตฌํ ์งํค๊ธฐ ๊ผญ ๊ธฐ์ต
๐ง๐ป๐ป0189) k๋ฒ ์ด๋ํ ๊ฒฐ๊ณผ์ array๋ฅผ in-place ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ค๋ฉด, ๋จผ์ reverse๋ฅผ ์งํํ ๋ค, index ๊ธฐ์ค 0 ~ k-1 / k ~๋๊น์ง์ ๊ฐ subarray๋ฅผ ๊ฐ๊ฐ reverse ์งํํ๋ค. (in-place reverse์ด๋ฏ๋ก ์ ๋์ ํฌ ํฌ์ธํฐ๋ฅผ ๋์ด์ ๋ ํฌ์ธํฐ๊ฐ ๋ง๋ ๋๊น์ง swap ์งํ)
0050. Pow(x,n) / 0560. Subarray Sum Equals K
class Solution:
def myPow(self, x: float, n: int) -> float:
def get_pow(x,n):
if n==0:
return 1
halved = get_pow(x,n//2)
if n%2 == 0:
return halved * halved
else:
return halved * halved * x
res = get_pow(x, abs(n))
return res if n >=0 else 1/res
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
res = 0
curSum = 0
prefixSums = { 0 : 1}
for n in nums:
curSum += n
diff = curSum - k
res += prefixSums.get(diff,0)
prefixSums[curSum] = 1 + prefixSums.get(curSum,0)
print(prefixSums)
return res
๐ง๐ป๐ป 0050) Power by Divide & Conquer ์ ํ.
โ x^n์ ๊ตฌํ ๋ ๋ง์ฝ, n์ด ์์๋ผ๋ฉด x^(abs(n))์ ๊ตฌํ๊ณ , ๊ตฌํ ๊ฒฐ๊ณผ๋ฅผ res๋ผ ํ๋ฉด 1/res๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
โก x^n = x^(n/2) * x^(n/2)๋ก x^(n/2)๋ฅผ ๊ตฌํ๋ฉด x^n์ ๊ตฌํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณฑ๋ง ํ๋ฉด ๋๋ฏ๋ก, O(logn) ์๊ฐ ๋ณต์ก๋๋ก ํด๊ฒฐํ ์ ์๋ค.
โข n์ 2๋ก ๋๋๊ณ ๋๋์ด n์ด 0์ด ๋ ๋๊น์ง(์ฌ๊ท์ด๋ฏ๋ก return ์กฐ๊ฑด n == 0์ผ ๋ return 1) divide.
๐ง๐ป๐ป 0560) O(n)์ ์ด์ฉํด์ ๋ถ๋ถ contiguous subarray์ ํฉ์ด k๊ฐ ๋๋ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ.
for๋ฌธ์ผ๋ก O(n) ๋๋ฆฌ๋ฉด์, ํ์ฌ ํด๋น ์์๋ฅผ ๋์ผ๋ก ํ๋ contiguous subarray ์ค ํฉ์ด k๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ ์ผ๋ก ๋ํด ๋๊ฐ๋ฉด ๋๋ค. ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์์ 2์ผ ๋, ์์ 2๋ฅผ ๋์ผ๋ก ํ๋ contiguous subarray๋ {-3, -1, 4, 3, 1, 2}, {-1, 4, 3, 1, 2}, {4, 3, 1, 2}, {3, 1, 2}, {1, 2}, {2} ์ด๋ ๊ฒ ์๋ค. ์ด ๋ ๊ฐ๊ฐ์ array ๊ฐ๊ฐ์ ํฉ์ด k๊ฐ ๋๋ ์ง ํ์ธํ๋ ค๋ฉด O(n^2) ์์. ์ด ๋ ์๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ฐ์์ ์๊ฐํด ๋ณผ ์ ์๋ค. ์์ ๋์ ํฉ์ ๊ฒฐ๊ณผ๋ฅผ hash map์ผ๋ก ์ ์ฅํ๋ฉฐ ์ ๋ฐ์ดํธ. ๊ถ๊ทน์ ์ผ๋ก index 0 ๋ถํฐ ํ์ฌ ์์ i๊น์ง์ ๋์ ํฉ - k์ธ diff๋งํผ ํด๋น๋๋ frequency(hash map indexing ๊ฒฐ๊ณผ)๋ฅผ ๋์ ์ผ๋ก ๋ํด์ฃผ์ด์ผ ๋๋ค. ๊ทธ๋ฌ๋ฉด hash map์ ๋์์ผ๋ก O(n)๋ง์ ๋ชจ๋ contiguous subarray์ ํฉ์ด k๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์๋ค.
* ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ถ๋ถ contiguous subarray์ ํฉ์ ์ผ์ชฝ ๋๋ถํฐ ํ์ฌ๊น์ง์ contiguous subarray์ ํฉ์ ์์ ์ผ์ชฝ ๋๋ถํฐ ๊ตฌํ๊ณ ์ ํ๋ subarray์ ์ ์์๊น์ง์ ํฉ์ ๋บ ๊ฒ๊ณผ ๊ฐ๋ค๋ ์์ด๋์ด๋ฅผ ์ฌ์ฉ
0525. Contiguous Array / 0424. Longest Repeating Character Replacement
class Solution:
def findMaxLength(self, nums: List[int]) -> int:
zero, one = 0,0
res = 0
diff_index = {} #diff(count[1] - count[0]) -> index
for i, n in enumerate(nums):
if n == 0:
zero += 1
else:
one += 1
if one - zero not in diff_index:
diff_index[one - zero] = i
if one == zero: #answer
res = one + zero
else:
idx = diff_index[one - zero]
res = max(res, i - idx)
return res
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
count = {}
res = 0
l = 0
maxf = 0
for r in range(len(s)):
count[s[r]] = 1 + count.get(s[r], 0)
maxf = max(maxf, count[s[r]])
while (r - l + 1) - maxf > k:
count[s[l]] -= 1
l += 1
res = max(res, r-l+1)
return res
๐ง๐ป๐ป 0525) hash map์ ๊ฐ index i๋ณ one-zero์ ๊ฐ์ ์ ์ฅํด์ฃผ๋ฉด ๋๋ค. ์ด ๋, ์๋ฅผ ๋ค์ด O(n)์ผ๋ก for๋ฌธ์ ๋๋ฆฌ๋ค๊ฐ index i์ one - zero๊ฐ 3์ด๋ผ๋ฉด, index i ๋ณด๋ค ์์ index j๊ฐ ๋์ผํ๊ฒ one - zero๊ฐ 3์ด๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด (i-j) ๋งํผ์ ์์ ๊ฐ์, ์ฆ index i+1๋ถํฐ j๊น์ง์ subarray์ one ๊ฐ์ = zero ๊ฐ์๋ผ๊ณ ํ ์ ์๋ค. ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์.
: ๋งจ ์ค๋ฅธ์ชฝ ์์ 1์ ์ค๋ฅธ์ชฝ ๋์ผ๋ก ๊ฐ๊ณ ์๋ subarray ์ค ๋๋ฑํ๊ฒ 0๊ณผ 1์ ๊ฐ์ ๊ฐ์๋ก ๊ฐ๊ณ ์๋ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฉด, one-zero๊ฐ 2์ธ ๋์ผ ์์น๋ ๋๊ตฐ๋ฐ. O(n)์ผ๋ก iteration ์งํํ ์๋ก ๊ธฐ์กด diff๊ฐ์ด diff_index key๊ฐ์ ์กด์ฌํ๋ฉด ํจ์ค. ์์ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ์์ผ๋ก์จ ๊ฐ์ฅ ๊ธด ๊ธธ์ด์ one-zero๊ฐ์ ๊ธธ์ด๋ฅผ ๋ณด์กดํ๋ค.
๐ง๐ป๐ป 0424) ์๋นํ ์ด๋ ค์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฌธ์ . for๋ฌธ์ผ๋ก O(n)๋งํผ ๋๋ฆฌ๋ฉฐ freq count dictionary ์ ๋ฐ์ดํธ. O(n)๋งํผ ๋๋ฆฌ๋ฉฐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋๋ฐ, ์ด ๋ (์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๊ธธ์ด - ์ ๋ฐ์ดํธ ๋๋ max_frequency(maxf))๊ฐ k๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ํด๋น ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๊ธธ์ด์ ๋์ผ character๋ง ๋ชจ๋ ๋ฃ์ ์ ์๋ค๋ ๋ป. ํ์ง๋ง, ๊ทธ ๋ฐ๋๋ก k๋ณด๋ค ํฌ๋ค๋ฉด ํด๋น ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธธ์ด์ ๋์ผ character๋ฅผ ๋ชจ๋ ๋ฃ์ ์ ์๋ค. ๋ฐ๋ผ์, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ l ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธธ์ด๋ฅผ ์ค์ด๋ฉฐ ์ ๋ฐ์ดํธ. l๊ณผ r ์ผ์ชฝ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ก ์ด๋ฃจ์ด์ง ์ฌ๋ผ์ด๋ฉ ์๋์ฐ: r์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๋ฉด์ ์ต๋ํ res ์ ๋ต ์ต๋๊ฐ์ ์ฐพ๊ณ , ๋ ์ด์ ์ฐพ์ ์ ์๋ค๋ฉด l์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๋ฉด์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธธ์ด ์กฐ์ .
0007. Reverse Integer / 0074. Search a 2D Matrix
class Solution:
def reverse(self, x: int) -> int:
if x>0:
value=int(str(x)[::-1]) #reversed
else:
value=-1*int(str(x*-1)[::-1]) #reversed
if value not in range(-2**31,2**31): #Overflow
value=0
return value
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
row, col = len(matrix), len(matrix[0])
target_in_a_row = -1
for x in range(row):
if target < matrix[x][0]:
break
target_in_a_row = x
if target_in_a_row == -1:
return False
l = matrix[target_in_a_row]
start, end = 0, len(l)-1
while start<=end:
mid = (start+end)//2
if target == l[mid]:
return True
elif target < l[mid]:
end = mid - 1
else:
start = mid + 1
return False
๐ง๐ป๐ป 0007) ์ฝ๊ฒ [::-1]๋ก reverse slicing
๐ง๐ป๐ป 0074) ๋จผ์ target์ด ๋ช๋ฒ์งธ ํ์ ํฌํจ๋์ด ์๋ ์ง ํ์ธ(๋ช๋ฒ์งธ ํ์ธ์ง ํฌํจ ๋ชจ๋ฅด๋ฉด False ๋ฆฌํด) / ๊ทธ ๋ค์, ํฌํจ๋ ํ์ ์ด๋ถ ํ์์ผ๋ก ๋๋ ค target์ ์ฌ๋ถ ํ์ธ. ์ด๋ฏธ ์ ๋ ฌ๋ ํ์ด๋ฏ๋ก ์ ๋ ฌ ์์ด ๋ฐ๋ก ์งํ.
0179. Largest Number / 0016. 3Sum Closest
class Solution:
def largestNumber(self, nums: List[int]) -> str:
nums = list(map(str, nums))
nums.sort(key=lambda x: x*10, reverse=True)
return str(int(''.join(nums)))
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res = nums[0] + nums[1] + nums[2]
for i in range(len(nums)-2):
l, r = i+1, len(nums)-1
while l < r:
s = nums[i] + nums[l] + nums[r]
if s == target:
return s
if abs(s - target) < abs(res - target):
res = s
if s < target:
l += 1
else:
r -= 1
return res
๐ง๐ป๐ป 0179) ์ฃผ์ด์ง ๋ฆฌ์คํธ ๋ด์ ์ฌ๋ฌ ์ซ์๋ฅผ 10๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ ์ ์ ๋ ฌ. ์ฆ ๋งจ ์์ ์ซ์๋ฅผ ๋น๊ตํด ํ์ธ. ์๋ฅผ ๋ค์ด 3๊ณผ 34๋ฅผ ๋น๊ตํ๋ค๋ฉด 334์ 343์ด ๋๋๋ฐ 34๊ฐ ๋จผ์ ์ค๊ณ 3์ด ๊ทธ ๋ค์ ์ค๋ ๊ฒ ๋ง๋ค. ์ด๋ฅผ ํ๋จํ๊ธฐ ์ํด์๋ 3์ 10๋ฒ ๋ฐ๋ณตํ ๊ฒฐ๊ณผ / 34๋ฅผ 10๋ฒ ๋ฐ๋ณตํ ๊ฒฐ๊ณผ ์ค ์ฌ์ ์ ์์๋ ๊ฑธ ํ์ธ. 3์ 10๋ฒ ๋ฐ๋ณตํ๊ฒ ์ฌ์ ์ ์์๋ฏ๋ก ์ฌ์ ์ ๋ค(reverse=True)์ ๋ฌธ์์ด์ ๋จผ์ ์ค๊ฒ ํ๋ค. ์ฆ ๋์ผ ๋ฌธ์์ด์ 10๋ฒ ๋ฐ๋ณตํ๊ฒ ํด์ ์ ๋ ฌ์ ํ ์ ์๋ค.
๐ง๐ป๐ป 0016) i ๊ณ ์ ํ๊ณ , j์ k ํฌ ํฌ์ธํฐ๋ฅผ i+1๋ถํฐ len(nums)-1๊น์ง ๋๋ฆฌ๋ฉด ๋๋ค. ํ ๊ฐ ํฌ์ธํฐ ๊ณ ์ ํ๊ณ ์ญ ๋๋จธ์ง ๋๋ฆฌ๋ ํฌ ํฌ์ธํฐ ๋ฐฉ์ ๋์ผ.
0227. Basic Calculator II / 0019. Remove Nth Node From End of List
class Solution:
def calculate(self, s: str) -> int:
stack = []
mul, share = False, False
ans = 0
real_s = []
for character in s:
if character != ' ':
if not real_s:
real_s.append(character)
else:
if character in ['-','+','*','/']:
real_s.append(character)
else:
if real_s[-1] in ['-','+','*','/']:
real_s.append(character)
else:
real_s.append(real_s.pop()+character)
for character in real_s:
if character.isdigit():
if mul:
stack.append(int(stack.pop())*int(character))
mul = False
elif share:
stack.append(int(stack.pop())//int(character))
share = False
else:
stack.append(character)
else:
if character == '*':
mul = True
elif character == '/':
share = True
else:
stack.append(character)
while stack:
popped = stack.pop()
if str(popped).isdigit():
popped = int(popped)
tmp = popped
else:
if popped == '-':
ans += (-tmp)
else:
ans += tmp
ans+=int(popped)
return ans
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
#get length
node = head
length = 1
while node.next != None:
node = node.next
length+=1
#remove order-th node
order = length - n
node = head
before = None
order_i = 0
while node != None:
if order_i == order:
if before == None:
head = node.next
else:
before.next = node.next
break
before = node
node = node.next
order_i+=1
return head
๐ง๐ป๐ป 0227)
โ '33 / 319 +2-1'๊ณผ ๊ฐ์ exp๊ฐ ์๋ค๋ฉด ๋์ด์ฐ๊ธฐ ๋ชจ๋ ์๋ตํ๊ณ , ์ซ์๋ ์ซ์๋ผ๋ฆฌ ๋จผ์ ๋ถ์ฌ์ real_s ๋ง๋ค๊ธฐ
โก ์ผ๋จ *์ /๋ง ๋จผ์ ์งํ๋๋ฏ๋ก +์ -๋ ๊ทธ๋๋ก ๋ฃ๊ณ , *์ /์ธ ๊ฒฝ์ฐ๋ง ์ฐ์ฐํด์ ๋จผ์ stack ์์ฑ
ex) '33*2+3'์ด ์๋ค๋ฉด '66+3'์ผ๋ก ๋ฐ๊พผ๋ค.
โข '3+1-2'์ ๊ฐ์ด +์ -๋ง ๊ตฌ์ฑ๋ stack์์ ๊ฑฐ๊พธ๋ก ์์ ๋ถํธ๊ฐ +๋ผ๋ฉด popped๋ฅผ ๊ทธ์ ๋ํ๊ณ , -๋ผ๋ฉด -popped๋ฅผ ๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งจ ์์ ๋จ์ ์ซ์๋ while stack ์ข ๋ฃ ์ดํ ans += int(popped) ์ฐ์ฐ์ผ๋ก ans update → return ans
๐ง๐ป๐ป 0019)
โ ๋จผ์ head ์ฒซ๋ฒ์งธ ๋ ธ๋ node๋ถํฐ node.next != None์ผ ๋๊น์ง ํ ๋ฐํด ๊ณ์ ๋๋ฆฌ๋ฉด์ node = node.next๋ก ์ ๋ฐ์ดํธํ๋ฉฐ(์ฆ, linked list๋ฅผ ๋๋ฆฌ๋ฉฐ) length += 1๋ก linked list์ ์ ์ฒด ๊ธธ์ด length ๊ตฌํ๊ธฐ
โก ๊ทธ๋ฌ๋ฉด order(length - n)๋ฒ์งธ์ node๋ฅผ ์ ๊ฑฐํ๊ธฐ. order_i = 0์ด๋ผ๋ ๋ณ์๋ฅผ ์ ํด order_i == order์ผ ๋ ํด๋น ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์๊ณผ ๋ค์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ์์ด๋์ด๋ฅผ ์๊ฐํด์ผ ํ๋ค. ํ์ฌ node์ ์์ node๋ฅผ before๋ผ๊ณ ํ๋ฉด, ์์ ๋ ธ๋๊ฐ ํ์ฌ node์ ๋ค์ ๋ ธ๋์ ์ฐ๊ฒฐํ๊ฒ ํด์ฃผ๋ฉด ๋๋ค.
(1) before node๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ: ์๋์ ๊ฐ์ด before.next =node.next
(2) before node๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ(์ฆ, ํ์ฌ node๊ฐ ๋งจ ์์ node์ผ ๊ฒฝ์ฐ): ์๋์ ๊ฐ์ด node.next๊ฐ ๋งจ ์์ head๊ฐ ๋๋ฏ๋ก head = node.next
โข ๊ณ์ while๋ฌธ์ ๋๋ฆฌ๋ฉด์ before, node, order_i๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ผ ํ๋ฏ๋ก before = node / node = node.next / order_i += 1 ์ฝ๋
0328. Odd Even Linked List / (โ ) 0024. Swap Nodes in Pairs
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
order = 0
odd_head = None
odd_before = None
even_head = None
even_before = None
cur_node = head
while cur_node != None:
if order == 0:
even_head = cur_node
even_before = cur_node
elif order == 1:
odd_head = cur_node
odd_before = cur_node
else:
if order%2==1:
odd_before.next = cur_node
odd_before = cur_node
else:
even_before.next = cur_node
even_before = cur_node
order+=1
cur_node = cur_node.next
if even_before:
even_before.next = None
if odd_before:
odd_before.next = None
cur_node = even_head
if cur_node:
while cur_node.next != None:
cur_node = cur_node.next
cur_node.next = odd_head
return even_head
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(0, head)
prev, curr = dummy, head
while curr and curr.next: #need at least two nodes
#save ptrs
nxtPair = curr.next.next
second = curr.next
#reverse this pair
second.next = curr
curr.next = nxtPair
prev.next = second
#update ptrs
prev = curr
curr = nxtPair
return dummy.next
๐ง๐ป๐ป 0328)
** Space Complexity O(1)๋ก ์ฝ๊ฒ odd number nodes์ even number nodes ๊ฐ๊ฐ ์ฐ๊ฒฐํด์ผ ํ๋ค.
โ odd์ฉ linked list์ even์ฉ linked list๋ฅผ ๊ธฐ์กด linked list์์ ๊ฐ๊ฐ ์ชผ๊ฐ๊ธฐ ์์ด๋์ด.
โก ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ node ๋๋ฌ ์ even_before, even_head / odd_before, odd_head ๊ฐ๊ฐ ์ด๊ธฐํ
โข ์ธ๋ฒ์งธ ์ด์์ node ๋๋ฌ ์ even node๋ผ๋ฉด even_before.next = cur_node๋ก ์ฐ๊ฒฐ. ๊ทธ๋ฆฌ๊ณ even_before๋ฅผ cur_node๋ก update / odd node๋ ๋ง์ฐฌ๊ฐ์ง
โฃ (**์ฃผ์) cur_node update ํ ์ ๋ฐ์ดํธ ๋๋ even_before / odd_before์ next ๊ฐ์ None์ผ๋ก ๋ฐ๊พธ์ด ์ง์ node์ ๊ฒฝ์ฐ node 4 -> node 5๊ฐ ์ฐ๊ฒฐ๋์ง ์๋๋ก ๋ ์ข ๋ฅ์ before๋ฅผ ์ง์์ ์ผ๋ก update
โค odd_head์ even_head ๋ ์ข ๋ฅ์ linked list ๋ง๋ค์ด์ก๋ค๋ฉด, even_head linked list๋ฅผ while๋ฌธ์ผ๋ก ๋๋ ค even_head linked list ๋งจ ์ค๋ฅธ์ชฝ node๋ก cur_node pointer ์ฎ๊ธฐ๊ธฐ. ๊ทธ๋ฆฌ๊ณ ์ฎ๊ฒจ์ง ์ต์ข cur_node์ next๋ฅผ odd_head๋ก ์ค์ ํด ๋ linked list ์ฐ๊ฒฐํ๋ฉด ๋!
๐ง๐ป๐ป 0024) pair ๊ธฐ์ค reverse ๋ฌธ์ ์ด๋ฏ๋ก ๋ ์นธ ์ฉ ์์ง์ด๋ฉฐ swapํ๋ฉด ๋๋ idea๋ฅผ ์๊ฐํด์ผ ํ๋ ๋ฌธ์ .
โ ํ์ฌ curr ๊ธฐ์ค ๋ฐ๋ก ์ node๋ฅผ prev, ๋ฐ๋ก ๋ค node๋ฅผ second, ๋ค์ ๋ค์ node๋ฅผ nxtPair๋ผ ํ์(while curr and curr.next๋ผ ํ์์ผ๋ฏ๋ก pair๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง while๋ฌธ ๋๋ฆด ์ ์๋ค)
โก prev -> second / second -> curr / curr -> nxtPair ์ด๋ ๊ฒ ์ธ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ node๋ก ๊ฐ๋ฆฌํค๊ฒ ๋ฐฉํฅ์ ์ ๋ฐ์ดํธ
โข prev, curr update
* ๋งจ ์์ dummy ptr ์์ด๋์ด๋ฅผ ์๊ฐํด ๋ด ์ด 3๊ฐ์ ์ฐ๊ฒฐ ์ค์ ๋ฐ๊ฟ์ผ ํ๋ค๋ ์์ด๋์ด๊ฐ ์ค์
'LeetCode Problems > Medium' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ง๐ปโ๐ป LeetCode Medium Collections 3 - 19 Problems (1) | 2024.12.09 |
---|---|
๐ง๐ปโ๐ป LeetCode Medium Collections 1 - 20 Problems (0) | 2024.09.09 |
๋๊ธ