diff --git a/find-minimum-in-rotated-sorted-array/gmlwls96.kt b/find-minimum-in-rotated-sorted-array/gmlwls96.kt
new file mode 100644
index 000000000..b28d5781d
--- /dev/null
+++ b/find-minimum-in-rotated-sorted-array/gmlwls96.kt
@@ -0,0 +1,24 @@
+class Solution {
+    // 시간 : O(logN) 공간 : O(1)
+    // 이분탐색.
+    fun findMin(nums: IntArray): Int {
+        var left = 0
+        var right = nums.lastIndex
+
+        while (left <= right){
+            val mid = (left + right)/2
+            when{
+                nums[mid-1] > nums[mid] -> {
+                    return nums[mid]
+                }
+                nums[0] < nums[mid] -> {
+                    left = mid + 1
+                }
+                else -> {
+                    right = mid -1
+                }
+            }
+        }
+        return nums[0]
+    }
+}
diff --git a/linked-list-cycle/gmlwls96.kt b/linked-list-cycle/gmlwls96.kt
new file mode 100644
index 000000000..76e444ef4
--- /dev/null
+++ b/linked-list-cycle/gmlwls96.kt
@@ -0,0 +1,16 @@
+class Solution {
+    // 시간 : O(n)
+    // 세트에 head.val 값을 추가하면서 동일한 값이 있는지 체크. 동일한 값이 존재하면 순회한다고 판단.
+    fun hasCycle(head: ListNode?): Boolean {
+        val set = mutableSetOf<Int>()
+        var next = head
+        while (next != null) {
+            if (set.contains(next.`val`)) {
+                return true
+            }
+            set.add(next.`val`)
+            next = next.next
+        }
+        return false
+    }
+}
diff --git a/longest-substring-without-repeating-characters/gmlwls96.kt b/longest-substring-without-repeating-characters/gmlwls96.kt
deleted file mode 100644
index 33808e5cc..000000000
--- a/longest-substring-without-repeating-characters/gmlwls96.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-class Solution {
-    // 시간 : O(n) 공간 : O(n)
-    fun lengthOfLongestSubstring(s: String): Int {
-        var max = 0
-        val subStr = StringBuffer()
-        s.forEach {     // s를 조회하면서 글자를 subStr에 담는다.
-            if (subStr.contains(it)) {     // 단, 겹치는 글자가 있을경우 subStr의 len을 기록하고, 초기화 한다.
-                max = max(max, subStr.length)
-                subStr.delete(0, subStr.length)
-            }
-            subStr.append(it)
-        }
-        max = max(max, subStr.length)
-        return max
-    }
-}
diff --git a/maximum-product-subarray/gmlwls96.kt b/maximum-product-subarray/gmlwls96.kt
new file mode 100644
index 000000000..45f7c28e0
--- /dev/null
+++ b/maximum-product-subarray/gmlwls96.kt
@@ -0,0 +1,15 @@
+class Solution {
+    fun maxProduct(nums: IntArray): Int {
+        var max = 1
+        var min = 1
+        var result = nums[0]
+        nums.forEach { num ->
+            val v1 = min * num
+            val v2 = max * num
+            min = min(min(v1, v2), num)
+            max = max(max(v1, v2), num)
+            result = max(max, result)
+        }
+        return result
+    }
+}
diff --git a/minimum-window-substring/gmlwls96.kt b/minimum-window-substring/gmlwls96.kt
new file mode 100644
index 000000000..0f62c888e
--- /dev/null
+++ b/minimum-window-substring/gmlwls96.kt
@@ -0,0 +1,32 @@
+class Solution {
+    fun minWindow(s: String, t: String): String {
+        if (s.length < t.length) {
+            return ""
+        }
+        val containIndexList = mutableListOf<Int>()
+        for (i in s.indices) {
+            if (t.contains(s[i])) {
+                containIndexList.add(i)
+            }
+        }
+        var answer = ""
+        val regex =
+            t.toCharArray().joinToString(separator = "", prefix = "^", postfix = ".+$") { """(?=.*${it})""" }.toRegex()
+        for (i in 0..containIndexList.size - t.length) {
+            val startIndex = containIndexList[i]
+            for (l in t.length..containIndexList.size - i) {
+                val endIndex = containIndexList[(i + l) - 1] + 1
+                val subStr = s.substring(startIndex, endIndex)
+                if (regex.containsMatchIn(subStr)) {
+                    if (answer.isEmpty()) {
+                        answer = subStr
+                    } else if (subStr.length < answer.length) {
+                        answer = subStr
+                    }
+                    break
+                }
+            }
+        }
+        return answer
+    }
+}