From 4a77a2f3dd6312488562c4005cf5b1c9e2f63185 Mon Sep 17 00:00:00 2001
From: Jinbeom <kst20026@gamil.com>
Date: Sat, 12 Oct 2024 03:56:16 +0900
Subject: [PATCH] Adds Solutions

---
 .../kayden.py                                 | 14 +++++
 linked-list-cycle/kayden.py                   | 14 +++++
 maximum-subarray/kayden.py                    | 15 +++++
 minimum-window-substring/kayden.py            | 39 +++++++++++++
 pacific-atlantic-water-flow/kayden.py         | 57 +++++++++++++++++++
 5 files changed, 139 insertions(+)
 create mode 100644 find-minimum-in-rotated-sorted-array/kayden.py
 create mode 100644 linked-list-cycle/kayden.py
 create mode 100644 maximum-subarray/kayden.py
 create mode 100644 minimum-window-substring/kayden.py
 create mode 100644 pacific-atlantic-water-flow/kayden.py

diff --git a/find-minimum-in-rotated-sorted-array/kayden.py b/find-minimum-in-rotated-sorted-array/kayden.py
new file mode 100644
index 000000000..83203d71e
--- /dev/null
+++ b/find-minimum-in-rotated-sorted-array/kayden.py
@@ -0,0 +1,14 @@
+class Solution:
+    # 시간복잡도: O(logN)
+    # 공간복잡도: O(1)
+    def findMin(self, nums: List[int]) -> int:
+        n = len(nums)
+        st, en = 0, n-1
+        while st < en:
+            mid = (st+en)//2
+            if nums[mid] > nums[en]:
+                st = mid + 1
+            else:
+                en = mid
+
+        return nums[st]
diff --git a/linked-list-cycle/kayden.py b/linked-list-cycle/kayden.py
new file mode 100644
index 000000000..79d62ff63
--- /dev/null
+++ b/linked-list-cycle/kayden.py
@@ -0,0 +1,14 @@
+class Solution:
+    # 시간복잡도: O(N)
+    # 공간복잡도: O(N)
+    def hasCycle(self, head: Optional[ListNode]) -> bool:
+
+        visited = set()
+        while head:
+            if head in visited:
+                return True
+
+            visited.add(head)
+            head = head.next
+
+        return False
diff --git a/maximum-subarray/kayden.py b/maximum-subarray/kayden.py
new file mode 100644
index 000000000..8ebd03a2a
--- /dev/null
+++ b/maximum-subarray/kayden.py
@@ -0,0 +1,15 @@
+class Solution:
+    # 시간복잡도: O(N)
+    # 공간복잡도: O(1)
+    def maxSubArray(self, nums: List[int]) -> int:
+
+        prev = 0
+        answer = float('-inf')
+        for num in nums:
+            if prev + num > num:
+                prev += num
+            else:
+                prev = num
+            answer = max(answer, prev)
+
+        return max(prev, answer)
diff --git a/minimum-window-substring/kayden.py b/minimum-window-substring/kayden.py
new file mode 100644
index 000000000..a82da281e
--- /dev/null
+++ b/minimum-window-substring/kayden.py
@@ -0,0 +1,39 @@
+from collections import Counter, deque
+class Solution:
+    # 시간복잡도: O(S+T)
+    # 공간복잡도: O(T)
+    def minWindow(self, s: str, t: str) -> str:
+        counter = Counter(t)
+
+        index = deque()
+        tot = 0
+        m = len(s)
+        st, en = 0, m - 1
+        for idx, ch in enumerate(s):
+            if ch not in counter:
+                continue
+
+            counter[ch] -= 1
+            index.append(idx)
+
+            if counter[ch] == 0:
+                tot += 1
+
+            while index:
+                if counter[s[index[0]]] < 0:
+                    counter[s[index[0]]] += 1
+                    index.popleft()
+                else:
+                    break
+
+            if tot == len(counter):
+                a = index[0]
+                b = idx
+                if b - a + 1 < m:
+                    st, en = a, b
+                    m = en - st + 1
+
+        if tot != len(counter):
+            return ""
+
+        return s[st:en + 1]
diff --git a/pacific-atlantic-water-flow/kayden.py b/pacific-atlantic-water-flow/kayden.py
new file mode 100644
index 000000000..43ebea743
--- /dev/null
+++ b/pacific-atlantic-water-flow/kayden.py
@@ -0,0 +1,57 @@
+class Solution:
+    # 시간복잡도: O(N*M)
+    # 공간복잡도: O(N*M)
+    def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
+
+        m = len(heights)
+        n = len(heights[0])
+        dx = [-1, 1, 0, 0]
+        dy = [0, 0, -1, 1]
+
+        dp = [[False] * (n) for _ in range(m)]
+        dp[0][n - 1] = True
+        dp[m - 1][0] = True
+        visited = set()
+
+        def dfs(x, y):
+            if dp[x][y]:
+                return 2
+
+            check = set()
+            for i in range(4):
+                nx = x + dx[i]
+                ny = y + dy[i]
+
+                if 0 <= nx < m and 0 <= ny < n:
+                    if (nx, ny) not in visited and heights[nx][ny] <= heights[x][y]:
+                        visited.add((nx, ny))
+                        res = dfs(nx, ny)
+
+                        if res != -1:
+                            check.add(res)
+                        visited.remove((nx, ny))
+                else:
+                    if x == 0 or y == 0:
+                        check.add(0)
+                    if x == m - 1 or y == n - 1:
+                        check.add(1)
+
+            if 2 in check:
+                dp[x][y] = 2
+                return 2
+
+            if len(check) == 2:
+                return 2
+
+            if check:
+                return check.pop()
+
+            return -1
+
+        answer = []
+        for i in range(m):
+            for j in range(n):
+                if dfs(i, j) == 2:
+                    answer.append([i, j])
+
+        return answer