Skip to content
26 changes: 26 additions & 0 deletions contains-duplicate/grapefruitgreentealoe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* @param {number[]} nums
* @return {boolean}
*/

/**
* 문제설명: 2개 이상 반복되는 값이 있으면 true, 모두 반복되지 않으면 false.

제한사항
1 <= nums.length <= 10^5
-109 <= nums[i] <= 109
*/

var containsDuplicate = function (nums) {
const numberSet = new Set();
//시간 복잡도 O(n)
for (let i of nums) {
if (!numberSet.has(i)) {
//공간복잡도 O(n)
numberSet.add(i);
} else {
return true;
}
}
return false;
};
30 changes: 30 additions & 0 deletions top-k-frequent-elements/grapefruitgreentealoe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* 정수 array nums , 정수 k가 있을때, 가장 빈도가 높은 숫자 k개 리턴. 순서상관 X
*/

/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/

//nums에 대해서 각 요소에 대해 중복되는 횟수를 구한다. 그리고 내림차순으로 k개 리턴한다.

var topKFrequent = function (nums, k) {
const numsFreqMap = new Map(); // O(1)

// O(n) 시간 / O(n) 공간
for (let i = 0; i < nums.length; i++) {
const count = (numsFreqMap.get(nums[i]) ?? 0) + 1; // O(1)
numsFreqMap.set(nums[i], count); // O(1)
}

const arrFromFreqMap = [...numsFreqMap]; // O(n) 시간 / O(n) 공간
arrFromFreqMap.sort((a, b) => b[1] - a[1]); // O(n log n) 시간

return arrFromFreqMap
.map((x) => x[0]) // O(n) 시간 / O(n) 공간
.slice(0, k); // O(k) 시간 / O(k) 공간
};

//O(n) + O(n log n) + O(n) + O(k) = O(n log n)
50 changes: 50 additions & 0 deletions two-sum/grapefruitgreentealoe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* 정수 숫자 배열과 정수 target
* 숫자 합이 target과 같은 두 숫자의 index를 리턴.
* 같은 요소 두번 X. 답은 항상 1개
* 정렬필요 X
*/

/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
//순회. target에서 nums[i]를 뺀 요소를 찾기.
//2중포문. 시간복잡도 O(1)~O(N^2)
for (let i = 0; i < nums.length; i++) {
const subNum = target - nums[i]; // 공간 O(1)
for (let j = i + 1; j < nums.length; j++) {
if (nums[j] == subNum) {
return [i, j];
Comment on lines +13 to +20
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

역시 시작은 다 이렇게..ㅋㅋ (저만 그런게 아니였네요)

}
}
}
};

var twoSum2 = function (nums, target) {
for (let i = 0; i < nums.length; i++) {
//시간복잡도 O(N)
const subNum = target - nums[i]; // 공간 O(1)
if (nums.includes(subNum) && nums.indexOf(subNum) !== i) {
//시간복잡도 O(N). 2중포문과 같은 효과.
return [i, nums.indexOf(subNum)];
}
}
};

//Better answer
var twoSum3 = function (nums, target) {
// map으로 관리하여 indexing 최적화
const numMap = new Map();
for (let i = 0; i < nums.length; i++) {
//시간복잡도 O(N)
const subNum = target - nums[i];
if (numMap.has(subNum)) {
//시간복잡도 O(1)
return [i, numMap.get(subNum)];
}
numMap.set(nums[i], i); // 공간 O(1)
}
};