From bafa98f6e76a532b638b3b99a295f390a31a2138 Mon Sep 17 00:00:00 2001 From: ZetBe Date: Tue, 16 Dec 2025 17:17:52 +0900 Subject: [PATCH 1/4] add solution: valid-parentheses --- valid-parentheses/ZetBe.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 valid-parentheses/ZetBe.py diff --git a/valid-parentheses/ZetBe.py b/valid-parentheses/ZetBe.py new file mode 100644 index 000000000..90c4320d1 --- /dev/null +++ b/valid-parentheses/ZetBe.py @@ -0,0 +1,33 @@ +''' +문제: 괄호 쌍 유효성 검사(서로 엇갈려서 짝이 맞으면 무효함) +풀이: 스택 자료구조를 활용하여 여는 괄호를 만나면 스택에 추가, 닫는 괄호를 만나면 스택의 최상단 요소와 비교하여 짝이 맞으면 pop, 아니면 False 반환 +시간복잡도: O(n) +공간복잡도: O(n) +사용한 자료구조: 스택(리스트) +''' + + +class Solution: + def isValid(self, s: str) -> bool: + stack = [] + + for i in s: + if len(stack) == 0 and (i == '}' or i == ')' or i == ']'): + return False + if i == '[' or i == '(' or i == '{': + stack.append(i) + if i == '}' or i == ')' or i == ']': + if i == '}' and stack[len(stack)-1] == '{': + stack.pop() + elif i == ')' and stack[len(stack)-1] == '(': + stack.pop() + elif i == ']' and stack[len(stack)-1] == '[': + stack.pop() + else: + return False + if len(stack) == 0: + return True + return False + + + From a4909852b680db7199c5c71992b79f41fbfb5cca Mon Sep 17 00:00:00 2001 From: ZetBe Date: Tue, 16 Dec 2025 17:18:25 +0900 Subject: [PATCH 2/4] add solution: container-with-most-water --- container-with-most-water/ZetBe.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 container-with-most-water/ZetBe.py diff --git a/container-with-most-water/ZetBe.py b/container-with-most-water/ZetBe.py new file mode 100644 index 000000000..c049dcda7 --- /dev/null +++ b/container-with-most-water/ZetBe.py @@ -0,0 +1,23 @@ +''' +문제: 컨테이너 최대 물 담기 +풀이: 양쪽 끝에서 시작하여 더 작은 쪽의 포인터를 이동시키며 최대 넓이를 계산 +시간복잡도: O(n) +공간복잡도: O(1) +사용한 자료구조: 투 포인터 +''' + + +class Solution: + def maxArea(self, height: List[int]) -> int: + r, l = len(height)-1, 0 + answer = (r-l)*(min(height[r], height[l])) + while r > l: + answer = max(answer, (r-l)*(min(height[r], height[l]))) + if height[r] < height[l]: + r -= 1 + else: + l += 1 + return answer + + + From 7f8423b57e6e2fd27b6585bed59f466258e000e8 Mon Sep 17 00:00:00 2001 From: ZetBe Date: Tue, 16 Dec 2025 17:18:56 +0900 Subject: [PATCH 3/4] add solution: longest-increasing-subsequence --- longest-increasing-subsequence/ZetBe.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 longest-increasing-subsequence/ZetBe.py diff --git a/longest-increasing-subsequence/ZetBe.py b/longest-increasing-subsequence/ZetBe.py new file mode 100644 index 000000000..59d6885d5 --- /dev/null +++ b/longest-increasing-subsequence/ZetBe.py @@ -0,0 +1,25 @@ +''' +문제: 최장 증가 부분 수열 +풀이: 이분 탐색을 활용하여 증가하는 수열을 유지하며 길이를 계산, 새로운 수가 기존 수열의 마지막 수보다 크면 추가, 그렇지 않으면 이분 탐색으로 적절한 위치를 찾아 교체 +시간복잡도: O(n log n) +공간복잡도: O(n) +사용한 자료구조: 리스트 +''' + + +from bisect import bisect_left + +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + answer = [nums[0]] + for i in range(1, len(nums)): + if answer[-1] < nums[i]: + answer.append(nums[i]) + else: + now = bisect_left(answer, nums[i]) + answer[now] = nums[i] + + return len(answer) + + + From ee68484a7950eb39ef214ae4f63b4e0159546c45 Mon Sep 17 00:00:00 2001 From: ZetBe Date: Tue, 16 Dec 2025 17:19:14 +0900 Subject: [PATCH 4/4] add solution: spiral-matrix --- spiral-matrix/ZetBe.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 spiral-matrix/ZetBe.py diff --git a/spiral-matrix/ZetBe.py b/spiral-matrix/ZetBe.py new file mode 100644 index 000000000..8006a456f --- /dev/null +++ b/spiral-matrix/ZetBe.py @@ -0,0 +1,40 @@ +''' +문제: 나선형으로 행렬을 순회하며 모든 원소를 반환 +풀이: 방문한 위치를 기록하는 행렬을 만들어 현재 방향으로 이동할 수 있는지 확인하며 이동, 이동할 수 없으면 방향을 바꿈 +시간복잡도: O(m*n) (m: 행의 수, n: 열의 수) +공간복잡도: O(m*n) (방문 기록을 위한 행렬) +사용한 자료구조: 리스트 +개인적인 회고: 문제 자체는 단순하지만 경계 조건과 방향 전환 로직을 꼼꼼히 처리해야 해서 구현에 신경을 써야 했다. 방문 기록 행렬을 사용하여 이미 방문한 위치를 피하는 방식이 직관적이고 이해하기 쉬웠다. +''' + +class Solution: + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: + v = [[0 for i in range(len(matrix[0]))] for j in range(len(matrix))] + if len(v) == 1: + return [i for i in matrix[0]] + if len(v[0]) == 1: + answer = [] + for i in matrix: + for j in i: + answer.append(j) + return answer + answer = [] + d = [[0, 1], [1, 0], [0, -1], [-1, 0]] + i = 0 + y, x = 0, 0 + while True: + if len(answer) == len(v)*len(v[0]): + break + v[y][x] = 1 + answer.append(matrix[y][x]) + ny = y + d[i][0] + nx = x + d[i][1] + if not(0 <= nx < len(v[0]) and 0 <= ny < len(v) and v[ny][nx] == 0): + i = (i+1)%4 + ny, nx = y + d[i][0], x + d[i][1] + y, x = ny, nx + + + return answer + +