From 666ad79c758e16d0029d85dbbaed72b20178c1ee Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Thu, 2 Jan 2025 04:42:33 +0900 Subject: [PATCH 1/8] merge-two-sorted-lists solution --- merge-two-sorted-lists/sungjinwi.py | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 merge-two-sorted-lists/sungjinwi.py diff --git a/merge-two-sorted-lists/sungjinwi.py b/merge-two-sorted-lists/sungjinwi.py new file mode 100644 index 000000000..dc4500aad --- /dev/null +++ b/merge-two-sorted-lists/sungjinwi.py @@ -0,0 +1,33 @@ +""" + 기억할 키워드 + dummy.next 리턴해서 건너뜀 + list1 list2 둘 중 하나가 None이 되면 while문 끝내고 나머지 next로 이어줌 + + list1의 길이 M, list2의 길이N + + TC : O(M + N) + + SC : O(1) + + 추가적인 풀이 : 알고달레에서 재귀방법 확인 +""" +# Definition for singly-linked list. +# 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]: + dummy = ListNode() + node = dummy + + while list1 and list2 : + if list1.val < list2.val : + node.next = ListNode(list1.val) + list1 = list1.next + else : + node.next = ListNode(list2.val) + list2 = list2.next + node = node.next + node.next = list1 or list2 + return dummy.next From 726459cf7b6f1d56801bc5d72c3041c7e21789ae Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Thu, 2 Jan 2025 04:43:06 +0900 Subject: [PATCH 2/8] missing-number solution --- missing-number/sungjinwi.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 missing-number/sungjinwi.py diff --git a/missing-number/sungjinwi.py b/missing-number/sungjinwi.py new file mode 100644 index 000000000..dd8ebcce8 --- /dev/null +++ b/missing-number/sungjinwi.py @@ -0,0 +1,16 @@ +""" + 풀이 : 비지 않을경우 합 nSum을 구하고 list를 돌면서 빼고 남은 것이 답 + + + TC : O(N) + sum구할 떄 O(N) + for문 O(N) = O(2N)\ + + SC : O(1) +""" + +class Solution: + def missingNumber(self, nums: List[int]) -> int: + nSum = sum(range(0,len(nums) + 1)) + for num in nums : + nSum -=num + return nSum From 32e1e4cd7460ca875d71c1954c67ac19a29f1d7a Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Thu, 2 Jan 2025 23:41:03 +0900 Subject: [PATCH 3/8] created files --- coin-change/sungjinwi.py | 0 palindromic-substrings/sungjinwi.py | 0 word-search/sungjinwi.py | 34 +++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 coin-change/sungjinwi.py create mode 100644 palindromic-substrings/sungjinwi.py create mode 100644 word-search/sungjinwi.py diff --git a/coin-change/sungjinwi.py b/coin-change/sungjinwi.py new file mode 100644 index 000000000..e69de29bb diff --git a/palindromic-substrings/sungjinwi.py b/palindromic-substrings/sungjinwi.py new file mode 100644 index 000000000..e69de29bb diff --git a/word-search/sungjinwi.py b/word-search/sungjinwi.py new file mode 100644 index 000000000..b8952f436 --- /dev/null +++ b/word-search/sungjinwi.py @@ -0,0 +1,34 @@ +class Solution: + def exist(self, board: List[List[str]], word: str) -> bool: + visit = {} + row = len(board) + col = len(board[0]) + + def dfs(m : int, n : int, seq : str) : + if visit[m, n] : + return + if not word.startswith(seq + board[m][n]) : + return + visit[(m, n)] = 1 + seq += board[m][n] + if seq == word : + return + if m > 0 : + if (dfs()) : + return True + if down : + dfs() + if left : + dfs() + if right : + dfs() + visit(m, n) = 0 + seq = seq[:len(seq)-1] + + + while m in range(row) : + while n in range(col) : + if dfs(m, n, "") : + return True + visit.clear() + return False From 333c656839315dc2ec20c869135ba865b616b5ef Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Fri, 3 Jan 2025 21:22:04 +0900 Subject: [PATCH 4/8] word-search solution --- word-search/sungjinwi.py | 67 ++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/word-search/sungjinwi.py b/word-search/sungjinwi.py index b8952f436..b6b8a86ee 100644 --- a/word-search/sungjinwi.py +++ b/word-search/sungjinwi.py @@ -1,34 +1,47 @@ +""" + 풀이 : + 상하좌우 이동한 좌표가 board범위 벗어나면 False + board[m][n]이 word[idx]와 불일치하면 False + 이미 방문했을경우 False + 단어가 완성되면 True + 상하좌우 한칸 이동한칸에 대해 재귀적 호출 + 상하좌우 중 True 있으면 True 없으면 False + + TC : O(M * N * 4 ^ W) + board의 크기에 비례 -> M * N + 단어의 길이 만큼 상하좌우 재귀 호출 -> 4 ^ W + + SC : O(M * N * W) + set의 메모리는 board 크기에 비례 -> M * N + 함수 호출 스택은 단어 길이에 비례 -> W +""" + class Solution: def exist(self, board: List[List[str]], word: str) -> bool: - visit = {} + visit = set() + + def dfs(m: int, n: int, idx: int) -> bool: + if not (0 <= m < row and 0 <= n < col): + return False + if not board[m][n] == word[idx]: + return False + if (m, n) in visit: + return False + if idx == len(word) - 1: + return True + + visit.add((m, n)) + if any (dfs(m + r, n + c, idx + 1) \ + for (r, c) in [(1, 0), (-1, 0), (0, 1), (0, -1)]): + return True + visit.remove((m, n)) + return False + row = len(board) col = len(board[0]) - - def dfs(m : int, n : int, seq : str) : - if visit[m, n] : - return - if not word.startswith(seq + board[m][n]) : - return - visit[(m, n)] = 1 - seq += board[m][n] - if seq == word : - return - if m > 0 : - if (dfs()) : - return True - if down : - dfs() - if left : - dfs() - if right : - dfs() - visit(m, n) = 0 - seq = seq[:len(seq)-1] - - while m in range(row) : - while n in range(col) : - if dfs(m, n, "") : + for m in range(row): + for n in range(col): + if dfs(m, n, 0): return True - visit.clear() return False From 7f4e8ad83242a0e51a50d911e235afa45e44939c Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Fri, 3 Jan 2025 21:22:04 +0900 Subject: [PATCH 5/8] word-search solution --- word-search/sungjinwi.py | 67 ++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/word-search/sungjinwi.py b/word-search/sungjinwi.py index b8952f436..863c1a98f 100644 --- a/word-search/sungjinwi.py +++ b/word-search/sungjinwi.py @@ -1,34 +1,47 @@ +""" + 풀이 : + 상하좌우 이동한 좌표가 board범위 벗어나면 False + board[m][n]이 word[idx]와 불일치하면 False + 이미 방문했을경우 False + 단어가 완성되면 True + 상하좌우 한칸 이동한칸에 대해 재귀적 호출 + 상하좌우 중 True 있으면 True 없으면 False + + TC : O(M * N * 4 ^ W) + board의 크기에 비례 -> M * N + 단어의 길이 만큼 상하좌우 재귀 호출 -> 4 ^ W + + SC : O(M * N + W) + set의 메모리는 board 크기에 비례 -> M * N + 함수 호출 스택은 단어 길이에 비례 -> W +""" + class Solution: def exist(self, board: List[List[str]], word: str) -> bool: - visit = {} + visit = set() + + def dfs(m: int, n: int, idx: int) -> bool: + if not (0 <= m < row and 0 <= n < col): + return False + if not board[m][n] == word[idx]: + return False + if (m, n) in visit: + return False + if idx == len(word) - 1: + return True + + visit.add((m, n)) + if any (dfs(m + r, n + c, idx + 1) \ + for (r, c) in [(1, 0), (-1, 0), (0, 1), (0, -1)]): + return True + visit.remove((m, n)) + return False + row = len(board) col = len(board[0]) - - def dfs(m : int, n : int, seq : str) : - if visit[m, n] : - return - if not word.startswith(seq + board[m][n]) : - return - visit[(m, n)] = 1 - seq += board[m][n] - if seq == word : - return - if m > 0 : - if (dfs()) : - return True - if down : - dfs() - if left : - dfs() - if right : - dfs() - visit(m, n) = 0 - seq = seq[:len(seq)-1] - - while m in range(row) : - while n in range(col) : - if dfs(m, n, "") : + for m in range(row): + for n in range(col): + if dfs(m, n, 0): return True - visit.clear() return False From 06701b11a7660eefb667d4a85f9a65f85b426ae6 Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Fri, 3 Jan 2025 21:46:04 +0900 Subject: [PATCH 6/8] delete empty palindrome-substrings --- palindromic-substrings/sungjinwi.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 palindromic-substrings/sungjinwi.py diff --git a/palindromic-substrings/sungjinwi.py b/palindromic-substrings/sungjinwi.py deleted file mode 100644 index e69de29bb..000000000 From c2689a9643f716b40927d390428eb4f7b779aba4 Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Sat, 4 Jan 2025 16:18:16 +0900 Subject: [PATCH 7/8] Refactor : use list1&& list2 instead make new instance --- merge-two-sorted-lists/sungjinwi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/merge-two-sorted-lists/sungjinwi.py b/merge-two-sorted-lists/sungjinwi.py index dc4500aad..236bea895 100644 --- a/merge-two-sorted-lists/sungjinwi.py +++ b/merge-two-sorted-lists/sungjinwi.py @@ -23,10 +23,10 @@ def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> while list1 and list2 : if list1.val < list2.val : - node.next = ListNode(list1.val) + node.next = list1 list1 = list1.next else : - node.next = ListNode(list2.val) + node.next = list2 list2 = list2.next node = node.next node.next = list1 or list2 From 563bc023031cf2e7e3c6cd6c4b0cace52f2bcb6f Mon Sep 17 00:00:00 2001 From: sungjinwi <0202wsj@gmail.com> Date: Sat, 4 Jan 2025 16:28:31 +0900 Subject: [PATCH 8/8] Refactor : early return instead of any() --- word-search/sungjinwi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/word-search/sungjinwi.py b/word-search/sungjinwi.py index 863c1a98f..5acc94b8b 100644 --- a/word-search/sungjinwi.py +++ b/word-search/sungjinwi.py @@ -31,9 +31,9 @@ def dfs(m: int, n: int, idx: int) -> bool: return True visit.add((m, n)) - if any (dfs(m + r, n + c, idx + 1) \ - for (r, c) in [(1, 0), (-1, 0), (0, 1), (0, -1)]): - return True + for (r, c) in [(1, 0), (-1, 0), (0, 1), (0, -1)] : + if(dfs(m + r, n + c, idx + 1)) : + return True visit.remove((m, n)) return False