diff --git a/contains-duplicate/youngduck.ts b/contains-duplicate/youngduck.ts new file mode 100644 index 0000000000..456cd52eca --- /dev/null +++ b/contains-duplicate/youngduck.ts @@ -0,0 +1,10 @@ +// 시간복잡도 : new Set은 n번 x add O(1) 인 함수, 즉 배열의 모든 원소를 한번씩 순회하므로 O(n) +// 공간복잡도 : n개의 원소를 Set에 저장하므로 O(n) + +function containsDuplicate(nums: number[]): boolean { + + const uniqueNumsSet = new Set(nums); + + return uniqueNumsSet.size !== nums.length; +}; + diff --git a/top-k-frequent-elements/youngduck.ts b/top-k-frequent-elements/youngduck.ts new file mode 100644 index 0000000000..61e5abad0e --- /dev/null +++ b/top-k-frequent-elements/youngduck.ts @@ -0,0 +1,27 @@ +// N은 nums의 길이, M은 서로 다른 숫자의 개수 +// 시간복잡도 : O(N + M log M) - N개 원소의 빈도를 세고, M개 항목을 빈도순으로 정렬 +// 공간복잡도 : O(M) - 서로 다른 숫자의 빈도를 Map에 저장하고 M개 항목의 배열 생성 + +function topKFrequent(nums: number[], k: number): number[] { + + // 숫자를 key, 등장 횟수를 value로 저장 + const FrequentMap = new Map(); + + for(const i of nums){ + if(FrequentMap.has(i)){ + // 이미 등장한 숫자는 횟수 증가. has로 확인했으므로 get의 결과가 undefined가 아님 + FrequentMap.set(i,FrequentMap.get(i)!+1); + } + else{ + // 처음 등장한 숫자는 1로 초기화 + FrequentMap.set(i,1); + } + } + + + return [...FrequentMap.entries()] // Map을 [숫자, 등장 횟수] 쌍의 배열로 변환 + .sort((a,b)=>b[1]-a[1]) // 등장 횟수를 기준으로 내림차순 정렬 + .slice(0,k) // 가장 많이 등장한 k개 항목 선택 + .map(([num])=>num); // 등장 횟수를 제외하고 숫자만 반환 +}; + diff --git a/two-sum/youngduck.ts b/two-sum/youngduck.ts new file mode 100644 index 0000000000..3f4297fc75 --- /dev/null +++ b/two-sum/youngduck.ts @@ -0,0 +1,29 @@ +// 시간복잡도 : 반복문한번에 완결된다 생각하여 O(N)인줄 알았는데 O(N^2)풀이라고 하네요, 해시맵으로 구현하는방법을 추가적으로 학습했습니다. +// 공간복잡도 : O(1) 입력값이 커져도 변수개수는 일정 + +function twoSum(nums: number[], target: number): number[] { + // 이중반복문이아니라 투포인터를 둬서 해결 + let left = 0, right = 1; + + while(left