Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions 3sum/ZetBe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
'''
문제: 중복되지 않는 세 수의 조합으로 합이 0이 되는 모든 경우를 찾기
풀이: 정렬된 배열에서 첫 번째 수를 고정하고, 나머지 두 수를 투 포인터로 탐색
시간복잡도: O(n^2)
배열을 정렬하는데 O(n log n), O(n)으로 순회하며 각 수에 대해 투 포인터로 나머지 두 수를 찾는데 O(n)이므로 전체 시간복잡도는 O(n^2)이다.
공간복잡도: O(1)
추가적인 공간을 사용하지 않으므로 전체 공간복잡도는 O(1)이다.
사용한 자료구조: 리스트

별도의 회고: 정답에 중복된 조합이 들어가지 않도록 하기 위해,
첫 번째 수를 고정할 때 이전 수와 같은 경우를 건너뛰고, 나머지 두 수를 찾을 때도 세 수의 합이 0일 경우, 각 두 동일한 수가 연속으로 나오는 경우를 건너뛰도록 하였다.
'''

import ast
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
answer = []
for i in range(len(nums)-2):
if i > 0 and nums[i-1] == nums[i]:
continue
l, r = i+1, len(nums)-1
while l < r:
if nums[i] + nums[l] + nums[r] == 0:
arr = [nums[i], nums[l], nums[r]]
answer.append(arr[:])
while l < r and nums[l] == nums[l + 1]:
l+=1
while l < r and nums[r] == nums[r - 1]:
r-=1
l += 1
r -= 1
elif nums[i] + nums[l] + nums[r] < 0:
l += 1
else:
r -= 1




return answer


24 changes: 24 additions & 0 deletions climbing-stairs/ZetBe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
'''
문제: 계단이 n 계단 있을 때, 한 번에 1계단 또는 2계단씩 오를 수 있는 방법의 수를 구하라.
풀이: 다이나믹 프로그래밍을 이용하여 각 계단에 도달하는 방법의 수를 저장한다.
n번째 계단에 도달하는 방법의 수는 (n-1)번째 계단과 (n-2)번째 계단에 도달하는 방법의 수의 합과 같다.
시간복잡도: O(n)
각 계단에 도달하는 방법의 수를 한 번씩 계산하므로 전체 시간복잡도는 O(n)이다.
공간복잡도: O(n)
다이나믹 프로그래밍을 위한 dp 배열이 n 크기를 가지므로 전체 공간복잡도는 O(n)이다.
사용한 자료구조: 리스트
'''

class Solution:
def climbStairs(self, n: int) -> int:
dp = [0 for i in range(n+1)]
if n < 3:
return n
dp[1] = 1
dp[2] = 2

for i in range(3, n+1):
dp[i] = dp[i-1]+dp[i-2]

return dp[n]

41 changes: 41 additions & 0 deletions product-of-array-except-self/ZetBe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'''
문제: 해당 인덱스를 제외한 나머지 인덱스의 곱을 구하라
풀이: 0의 개수에 따라 경우를 나눠서 풀이
1. 0이 2개 이상인 경우: 모든 인덱스의 곱이 0이므로, [0, 0, ..., 0] 반환
2. 0이 1개인 경우: 0이 있는 인덱스에는 나머지 인덱스의 곱을, 나머지 인덱스에는 0을 반환
3. 0이 없는 경우: 전체 곱을 각 인덱스의 값으로 나누어 반환
시간복잡도: O(n)
nums 배열을 한 번씩 순회하며 곱을 계산하고, 다시 한 번씩 순회하며 결과를 계산하므로 전체 시간복잡도는 O(n)이다.
공간복잡도: O(n)
같은 크기의 결과 배열을 반환하므로 전체 공간복잡도는 O(n)이다.
사용한 자료구조: 딕셔너리, 리스트
'''

class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
d = {}
now = 1
answer = []
for i in nums:
if i in d:
d[i] += 1
else:
d[i] = 1
if i != 0:
now *= i

if 0 in d and d[0] > 1:
return [0 for i in range(len(nums))]

if 0 in d and d[0] == 1:
for i in nums:
if i == 0:
answer.append(now)
else:
answer.append(0)
return answer

for i in nums:
answer.append(now//i)
return answer

34 changes: 34 additions & 0 deletions valid-anagram/ZetBe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
'''
문제: 두 문자열이 주어졌을 때, 두 문자열이 아나그램인지 판별하는 함수를 작성하시오.
아나그램이란, 한 문자열의 문자를 재배열하여 다른 문자열을 만들 수 있는 경우를 말합니다. 예를 들어, "listen"과 "silent"는 아나그램입니다.
해결: 딕테이션을 활용하여 각 문자열의 문자 빈도수를 저장한 후, 두 딕테이션이 동일한지 비교합니다.

시간복잡도: O(n), n은 문자열의 길이
각 문자열을 한 번씩 순회하며 딕테이션에 문자의 빈도수를 기록하기 때문에 전체 시간복잡도는 O(n)입니다.
공간복잡도: O(1)
알파벳의 개수는 고정되어 있으므로, 딕테이션에 저장되는 문자의 개수는 최대 26개(영어 알파벳 기준)로 제한됩니다. 따라서 공간복잡도는 O(1)입니다.
'''

class Solution:
def isAnagram(self, s: str, t: str) -> bool:
d1 = {}
d2 = {}
if len(s) != len(t):
return False

for i in range(len(s)):
if s[i] in d1:
d1[s[i]] += 1
else:
d1[s[i]] = 1

if t[i] in d2:
d2[t[i]] += 1
else:
d2[t[i]] = 1


if d1 == d2:
return True
return False

31 changes: 31 additions & 0 deletions validate-binary-search-tree/ZetBe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'''
문제: 이진 탐색 트리가 유효한지 확인하기
풀이: 깊이 우선 탐색(DFS)을 사용하여 각 노드가 유효한 범위 내에 있는지 확인
시간복잡도: O(n)
모든 노드를 한 번씩 방문하므로 전체 시간복잡도는 O(n)이다.
공간복잡도: O(h)
재귀 호출 스택이 트리의 높이 h에 비례하므로 전체 공간복잡도는 O(h)이다.
'''



# 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 isValidBST(self, root: Optional[TreeNode]) -> bool:
def dfs(root, ma, mi):
if root == None:
return True

if not (mi < root.val < ma):
return False

return dfs(root.left, root.val, mi) and dfs(root.right, ma, root.val)

a = dfs(root, 10**100, -1*(10**100))
return a