LeetCode 329

96. Unique Binary Search Trees

96. Unique Binary Search Trees class Solution: def numTrees(self, n: int) -> int: # DP 배열 초기화 (Initialize the DP array) # dp[i]: i개의 노드를 사용하여 만들 수 있는 고유한 BST의 개수 # dp[i]: Number of unique BSTs that can be formed using i nodes dp = [0] * (n + 1) dp[0] = 1 # 빈 트리의 경우, 가능한 BST는 1개 (Empty tree has one valid BST) dp[1] = 1 # 노드가 1개인 경우, 가능한 BST는 1개 (One ..

LeetCode/DP심화 2025.01.07

1312. Minimum Insertion Steps to Make a String Palindrome

1312. Minimum Insertion Steps to Make a String Palindrome class Solution: def minInsertions(self, s: str) -> int: # Palindrome: 앞뒤로 읽었을때 동일한 string # 최소로 추가해야 하는 문자 개수를 반환 # 이미 Palindrome 이면 0 반환 # 그럼 우선 Palindrome 인지 체크하고 if s == s[::-1]: # Palindrome 이면 return 0 # 아니면 # s 와 뒤집은 s, 즉 reverse_s 의 LCS 최고로 긴 공통 문자열 찾아서, ..

LeetCode/DP심화 2025.01.06

354. Russian Doll Envelopes ★★★

354. Russian Doll Envelopes class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: # DP로 풀어야 함 # 안에 들어가려면, 가로, 세로 둘다 다른것보다 작아야 함 # 우선 정렬하고 # envelope 리스트에는 계속 포함되는 거는 계속 추가하고 # max_width, max_height 최대로 업데이트.. # LIS 풀듯이 풀어보자! envelopes = sorted(envelopes, key=lambda k:(k[0], k[1])) # 자신 포함이니 1로 초기화 dp =..

LeetCode/DP심화 2025.01.06

1027. Longest Arithmetic Subsequence

1027. Longest Arithmetic Subsequence class Solution: def longestArithSeqLength(self, nums: List[int]) -> int: # longestArithSeq 는 같은 간격을 같는 LIS 를 찾는 거라서. # 즉, "등차수열을 이루는 가장 긴 부분 수열의 길이" # 해쉬맵에 lenLIS 와 간격 difference 를 저장해야 할듯 dp = {} # 키: (index, difference) -> 값: 등차수열의 길이 max_len = 1 # 최소 길이는 1 for i in range(len(nums)): # 정방향 순회 for j in..

LeetCode/DP심화 2025.01.05