diff --git a/merge-two-sorted-lists/Jay-Mo-99.py b/merge-two-sorted-lists/Jay-Mo-99.py new file mode 100644 index 000000000..c4ee75756 --- /dev/null +++ b/merge-two-sorted-lists/Jay-Mo-99.py @@ -0,0 +1,27 @@ + #해석 + #list1 과 list2는 이미 오름차순 정렬된 리스트 + #두 리스트의 첫 노드값을 비교해 더 작은값을 첫번째 노드로 선택 + #이후 선택된 노드의 next포인터를 재귀적으로 처리하여 노드 병합 + + + #Big O + #N: 매개변수 n의 크기(계단 갯수) + + #Time Complexity: O(M + N) + #- M: list1의 길이 + #- N: list2의 길이 + #- 각 재귀 호출에 하나의 노드가 다뤄진다, 따라서 최대 M+N 번의 재귀호출 발생 + + + #Space Complexity: O(M+N) + #- 병합 리스트의 최대 길이 M+N이므로, 스택 공간 사용도 이에 비례한다. + +class Solution(object): + def mergeTwoLists(self, list1, list2): + if list1 and list2: ## 두 리스트가 모두 비어있지 않은 경우에만 해당 + if list1.val > list2.val: # list1의 현재 값이 list2보다 크다면 + list1, list2 = list2, list1 # 값을 교환하여 항상 list1이 더 작은 값을 가짐 + list1.next = self.mergeTwoLists(list1.next, list2) # list1의 다음 노드와 list2로 재귀 호출 + return list1 or list2 # 리스트가 하나라도 비어 있다면 비어 있지 않은 리스트를 반환 + + diff --git a/missing-number/Jay-Mo-99.py b/missing-number/Jay-Mo-99.py new file mode 100644 index 000000000..4dd67c175 --- /dev/null +++ b/missing-number/Jay-Mo-99.py @@ -0,0 +1,42 @@ + #해석 + #nums가 0에서 len(nums) 까지의 숫자를 포함하나 확인하고, 없다면 해당 숫자를 return한다. + #nums를 오름차순 정렬한다 + #nums가 조건을 만족하면, nums[i]는 인덱스 i와 동일해야한다. (e.g nums[0] =0, nums[1]=1) + #배열의 마지막 요소(nums(len(num-1))) 이 len(nums)와 동일하지 않으면 nums은 0~len(nums) 까지의 숫자를 가진다는 조건을 만족 X -> 누락된 len(nums)를 return한다. + #for loop 로 각 숫자가 인덱스와 일치 여부 확인 + #인덱스와 값이 일치하지 않는 nums[i]의 인덱스를 return한다. + + + #Big O + #N: 매개변수 n의 크기(계단 갯수) + + #Time Complexity: O(nlog(n)) = O(nlog(n))+O(1)+O(n) + #- n: nums배열의 길이 + #- sort(): Timsort방식이기에 O(nlog(n)) + #-if(nums[len(nums)-1] != len(nums)): 단일 조건 비교는 O(1) + #for loop: nums의 길이에 비례하므로 O(n) + + + #Space Complexity: O(1) + #- sort(): nums.sort()는 제자리 정렬이기에 추가 공간 필요치 않으므로 O(1) + +class Solution(object): + def missingNumber(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + # Sort the list + nums.sort() + # If the last element of nums doesn't align with the numbers of element in nums, return len(nums) + # For example, nums[0,1] so range is [0:2] but there's no last element of 2 so return 2(len(nums)) + if(nums[len(nums)-1] != len(nums)): + return len(nums) + #If each element doesn't match with the number of [0:len(nums)], return the i(index) + for i in range(len(nums)): + if nums[i] != i: + print(nums[i],i) + return i + + + diff --git a/valid-anagram/Jay-Mo-99.py b/valid-anagram/Jay-Mo-99.py index e69de29bb..6aafc19cb 100644 --- a/valid-anagram/Jay-Mo-99.py +++ b/valid-anagram/Jay-Mo-99.py @@ -0,0 +1,32 @@ + #해석 + #문자열 s의 재배치로 문자열 t를 구성할 수 있으면 anagram으로 return true. + #s와 t를 list로 바꾸고 sort하여 오름차순으로 정렬시킨다, 둘이 같으면 같은 문자를 가진 문자열 리스트이므로 return true + + #Big O + #N: 주어진 문자열 s와 t의 길이(N) + + #Time Complexity: O(N) + #- 문자열을 list로 변환하는 작업: O(N) + #- 정렬작업 : NO(log N) + #- 리스트 비교 작업, s와 t의 각 문자가 서로 일치하는지 체크한다 : O(N) + #- 최종: O(N) + + #Space Complexity: O(N) + #- list s와 t는 주어진 문자열 s와 t에 기반하여 새로운 list 객체로 할당된다: O(N) + +class Solution(object): + def isAnagram(self, s, t): + """ + :type s: str + :type t: str + :rtype: bool + """ + s = list(s) #Convert string to list + t = list(t) + s.sort() #Sort the list + t.sort() + + return s == t #If the s and t are same, return true(anagram) + + +