From 857337b656e263acf5343b1591309be9bdebabd6 Mon Sep 17 00:00:00 2001 From: mangodm-web Date: Wed, 2 Oct 2024 19:54:48 +0900 Subject: [PATCH 1/2] feat: add merge two sorted lists solution --- merge-two-sorted-lists/mangodm-web.py | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 merge-two-sorted-lists/mangodm-web.py diff --git a/merge-two-sorted-lists/mangodm-web.py b/merge-two-sorted-lists/mangodm-web.py new file mode 100644 index 00000000..ef372c94 --- /dev/null +++ b/merge-two-sorted-lists/mangodm-web.py @@ -0,0 +1,34 @@ +from typing import Optional + + +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + + +class Solution: + def mergeTwoLists( + self, list1: Optional[ListNode], list2: Optional[ListNode] + ) -> Optional[ListNode]: + """ + - Idea: dummy node를 하나 만들고, 두 리스트를 순회하면서 값을 비교하여 더 작은 노드를 dummy node에 이어 붙인다. + 둘 중 하나가 먼저 순회가 끝났다면, 나머지 리스트의 남은 노드들을 그대로 이어 붙인다. (리스트 내에서는 순서가 정렬되어 있음이 보장되어 있기 때문에 가능하다.) + - Time Complexity: O(n), n은 m + k, m과 k은 각각 list1, list2의 길이이다. + - Space Complexity: O(1), 추가적인 공간은 사용하지 않고, 기존 노드를 재사용하여 연결한다. + """ + merged = ListNode() + cur = merged + + while list1 and list2: + if list1.val > list2.val: + cur.next = list2 + list2 = list2.next + else: + cur.next = list1 + list1 = list1.next + cur = cur.next + + cur.next = list1 or list2 + + return merged.next From f1f82aa12350910f5b5599c09ea5e2586807cfa5 Mon Sep 17 00:00:00 2001 From: mangodm-web Date: Wed, 2 Oct 2024 19:55:02 +0900 Subject: [PATCH 2/2] feat: add longest repeating character replacement solution --- .../mangodm-web.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 longest-repeating-character-replacement/mangodm-web.py diff --git a/longest-repeating-character-replacement/mangodm-web.py b/longest-repeating-character-replacement/mangodm-web.py new file mode 100644 index 00000000..ae088b6b --- /dev/null +++ b/longest-repeating-character-replacement/mangodm-web.py @@ -0,0 +1,26 @@ +from collections import defaultdict + + +class Solution: + def characterReplacement(self, s: str, k: int) -> int: + """ + - Idea: 슬라이딩 윈도우를 이용해 현재 윈도우 내에서 가장 자주 나타나는 문자의 개수를 추적한다. + 최대 k개의 문자를 바꿨을 때, 모든 문자가 같은 부분 문자열의 최대 길이를 계산한다. + 윈도우가 유효하지 않으면, 왼쪽 포인터를 이동시켜 윈도우 크기를 조정한다. + - Time Complexity: O(n), n은 문자열의 길이다. 각 문자를 한번씩 순회하고, 슬라이딩 윈도우를 조정한다. + - Space Complexity: O(26) = O(1), 슬라이딩 윈도우 내에 포함된 문자의 개수를 세기 위한 공간으로, 최대 알파벳 문자의 개수(26개)만큼 늘어날 수 있다. + """ + result = 0 + counter = defaultdict(int) + left = 0 + + for right in range(len(s)): + counter[s[right]] = counter[s[right]] + 1 + + while (right - left + 1) - max(counter.values()) > k: + counter[s[left]] -= 1 + left += 1 + + result = max(result, right - left + 1) + + return result