Skip to content

Commit 9e5e7e4

Browse files
week 2 과제 제출
과제 제출
1 parent 5e5ebe7 commit 9e5e7e4

File tree

5 files changed

+205
-0
lines changed

5 files changed

+205
-0
lines changed

3sum/taurus09318976.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# 이 문제는 1)정렬을 통해 중복을 처리, 2)투 포인터를 사용하여 효율적으로 탐색,
2+
#3) 합이 0보다 작으면 left를 +1, 크면 right를 -1이동, 4)중복된
3+
4+
class Solution:
5+
def threeSum(self, nums: List[int]) -> List[List[int]]:
6+
nums.sort() #중복된 숫자를 쉽게 처리하고, 투 포인터 기법을 사용하기 위해 배열을 정렬
7+
result = []
8+
9+
#첫번째 숫자를 선택하는 루프
10+
#마지막 두 숫자는 left와 right가 사용하므로 len(nums)-2해야 함
11+
#예: len(nums) = 4라면, range(2)=[0,1]
12+
for i in range(len(nums) - 2):
13+
#첫번째 숫자가 이전과 같으면 건너뜀
14+
if i > 0 and nums[i] == nums[i-1]:
15+
continue
16+
17+
#투 포인터 설정 : left는 첫번째 숫자 다음부터, right는 배열의 끝부터 설정
18+
left, right = i + 1, len(nums) - 1
19+
20+
while left < right:
21+
total = nums[i] + nums[left] + nums[right]
22+
#합이 0보다 작으면 left를 +1
23+
if total < 0:
24+
left += 1
25+
#합이 0보다 크면 right를 -1이동
26+
elif total > 0:
27+
right -= 1
28+
else:
29+
#합이 0인 경우 처리
30+
result.append([nums[i], nums[left], nums[right]])
31+
#중복된 숫자 건너뛰기
32+
while left < right and nums[left] == nums[left + 1]:
33+
left += 1
34+
while left < right and nums[right] == nums[right - 1]:
35+
right -= 1
36+
#다음 가능한 조합을 찾기 위해 포인터를 이동
37+
left += 1
38+
right -= 1
39+
40+
return result
41+
42+
43+
#시간 복잡도: O(n²)
44+
#정렬: O(n log n)
45+
#메인 루프: O(n²)
46+
#공간 복잡도: O(1) (출력 배열 제외하고 추가적인 공간을 사용하지 않음)
47+
48+
49+

climbing-stairs/taurus09318976.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#이 문제는 피보나치 수열과 동일한 패턴을 가지고 있음. 피보나치 수열의 (n+1)번째 수와 같음
2+
3+
class Solution:
4+
def climbStairs(self, n: int) -> int:
5+
#n이 1이나 2인 경우는 바로 결과 반환
6+
if n == 1:
7+
return 1
8+
if n == 2:
9+
return 2
10+
11+
#첫 번째, 두 번째 계단의 방법 수 저장
12+
prev, curr = 1, 2
13+
14+
#세 번째 계단부터 n계단까지 계산
15+
for i in range(3, n + 1):
16+
prev, curr = curr, prev + curr
17+
18+
return curr
19+
20+
21+
#시간 복잡도: O(n)
22+
#for 루프가 n-2번 실행됨(3부터 n까지)
23+
#각 반복에서 상수 시간(1)의 연산만 수행됨
24+
#따라서 전체 시간은 n에 비례함
25+
26+
#공간 복잡도: O(1)
27+
#추가적인 배열이나 리스트를 사용하지 않음
28+
#두 개의 변수(prev, curr)만 사용함
29+
#입력 크기(n)가 아무리 커져도 사용하는 공간은 일정함
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#이 문제는 배열의 각 요소 i를 제외한 나머지 요소들의 곱을 구하는 문제임
2+
#1)각 요소 i를 기준으로 왼쪽 숫자들의 곱과 오른쪽 숫자들의 곱을 따로 계산, 2)최종 결과는 왼쪽 곱과 오른쪽 곱의 곱
3+
4+
class Solution:
5+
def productExceptSelf(self, nums: List[int]):
6+
#입력 배열의 길이를 저장
7+
##Example 1의 경우 : len(nums) = 4
8+
n = len(nums)
9+
#결과를 저장할 배열을 곱셈의 항등원인 1로 모두 초기화
10+
#cf. 빈 집합의 곱은 1, 합은 0으로 정의됨
11+
##answer = [1] * 4 = [1, 1, 1, 1]
12+
answer = [1] * n
13+
14+
#i를 기준으로 왼쪽 숫자들의 곱을 계산
15+
#왼쪽 곱의 초기값
16+
left_product = 1
17+
for i in range(n):
18+
#현재 위치의 왼쪽 곱을 저장
19+
##nums[0]의 왼쪽에는 아무 숫자도 없으므로,
20+
##아무것도 없는 상태의 곱은 1임. 따라서 answer[0]=1
21+
##answer[1]=1 / answer[2]=2 / answer[3]=6
22+
answer[i] = left_product
23+
#다음 위치를 위해 현재 수를 곱함
24+
##left_product = 1 * 1 = 1 / left_product = 1 * 2 = 2
25+
##left_product = 2 * 3 = 6 / left_product = 6 * 4 = 24
26+
left_product *= nums[i]
27+
28+
##첫 번째 for문 후 answer = [1, 1, 2, 6]
29+
#i를 기준으로 오른쪽 숫자들의 곱 계산 및 최종 결과 생성
30+
right_product = 1
31+
#오른쪽에서 왼쪽으로 순회
32+
for i in range(n-1, -1, -1):
33+
#현재 위치의 오른쪽 곱을 저장
34+
##answer[3] = 6 * 1 = 6 / answer[2] = 2 * 1 = 2
35+
##answer[1] = 1 * 1 = 1 / answer[1] = 1 * 1 = 1
36+
answer[i] *= right_product
37+
#다음 위치를 위해 현재 수를 곱함
38+
##right_product = 1 * 4 = 4 / right_product = 4 * 3 = 12
39+
##right_product = 12 * 2 = 24 / right_product = 24 * 1 = 24
40+
right_product *= nums[i]
41+
42+
43+
#최종 결과를 반환
44+
##최종 answer = [24, 12, 8, 6]
45+
return answer
46+
47+
#시간 복잡도: O(n)
48+
##두 번의 선형 순회만 수행하며, 각 순회는 O(n) 시간이 소요
49+
#공간 복잡도: O(1)
50+
##추가적인 공간을 사용하지 않음
51+
##단, 출력 배열은 문제의 요구사항이므로 제외
52+
53+
54+
55+

valid-anagram/taurus09318976.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#이 문제를 해결하기 위해선 1)두 문자열의 길이가 같은지 확인(길이가 다르면 아나그램이 될 수 없음), 2)char_count딕셔너리를 사용하여 첫번째 문자열의 문자별 개수를 확인, 3)두번째 문자열을 순회하면서 각 문자의 개수를 하나씩 감소시킴, 4)만약 두번째 문자열에 첫번째 문자열에 없는 문자가 있거나, 어떤 문자의 개수가 음수가 되면(첫번째 문자열에 있는 문자가 두번째 문자열에 없다는 의미) 아나그램이 아님
2+
class Solution:
3+
def isAnagram(self, s: str, t: str):
4+
# 두 문자열의 길이가 다르면 아나그램이 될 수 없음
5+
if len(s) != len(t):
6+
return False
7+
8+
# 각 문자의 개수를 저장할 빈 딕셔너리
9+
char_count = {}
10+
11+
# 첫 번째 문자열의 각 문자를 순회
12+
for i in s:
13+
#해당 문자가 없으면 0, 있으면 현재값 i를 반환하고, 각 문자의 개수 1을 더함
14+
char_count[i] = char_count.get(i, 0) + 1
15+
16+
# 두 번째 문자열의 문자별 개수만큼 char_count딕셔너리에서 빼기
17+
for i in t:
18+
#첫번째 문자열에 없는 문자가 있는 경우
19+
if i not in char_count:
20+
return False
21+
22+
char_count[i] -= 1
23+
#char_count가 음수이므로 첫번째 문자열에 있는 문자가 두번째 문자열에 없다는 의미
24+
if char_count[i] < 0:
25+
return False
26+
27+
return True
28+
29+
30+
#시간 복잡도: O(n), n= 문자열의 길이
31+
#공간 복잡도: O(1), 입력 크기(n)가 아무리 커져도 사용하는 공간이 일정함(영어 소문자만 사용하므로 최대 26개의 키만 저장하면 됨)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
8+
#val: 노드의 값, left: 왼쪽 자식 노드, right: 오른쪽 자식 노드
9+
#helper 함수: 재귀적으로 BST의 유효성을 검사
10+
#lower: 현재 노드의 값이 가져야 하는 최소값
11+
#upper: 현재 노드의 값이 가져야 하는 최대값
12+
13+
class Solution:
14+
def isValidBST(self, root: TreeNode):
15+
def helper(node, lower=float('-inf'), upper=float('inf')):
16+
if not node:
17+
return True
18+
19+
# BST 조건 검사 현재 노드의 값이 허용되는 범위를 벗어나는지 확인(벗어나면 false 반환)
20+
if node.val <= lower or node.val >= upper:
21+
return False
22+
23+
# 왼쪽 서브트리 검사 (상한을 현재 노드의 값으로 설정)
24+
if not helper(node.left, lower, node.val):
25+
return False
26+
27+
# 오른쪽 서브트리 검사 (하한을 현재 노드의 값으로 설정)
28+
if not helper(node.right, node.val, upper):
29+
return False
30+
31+
return True
32+
33+
return helper(root)
34+
35+
#시간 복잡도: O(n)
36+
#모든 노드를 한번씩 방문
37+
#공간 복잡도: O(n)
38+
#재귀 호출 스택의 깊이가 트리의 높이만큼 필요
39+
40+
41+

0 commit comments

Comments
 (0)