diff --git a/contains-duplicate/y00eunji.js b/contains-duplicate/y00eunji.js new file mode 100644 index 000000000..85439fb04 --- /dev/null +++ b/contains-duplicate/y00eunji.js @@ -0,0 +1,9 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ +var containsDuplicate = function(nums) { + // set에 넣어 중복을 줄이고 길이를 비교한다. + + return new Set(nums).size !== nums.length; +}; diff --git a/house-robber/y00eunji.js b/house-robber/y00eunji.js new file mode 100644 index 000000000..f9d75694c --- /dev/null +++ b/house-robber/y00eunji.js @@ -0,0 +1,23 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var rob = function(nums) { + const len = nums.length; + if (len === 0) return 0; + if (len === 1) return nums[0]; + if (len === 2) return Math.max(nums[0], nums[1]); + + const dp = Array(len).fill(0); + dp[0] = nums[0]; + dp[1] = Math.max(nums[0], nums[1]); + + // 현재 집을 터는 경우와 안 터는 경우 중 최대값 선택 + // 1. 이전 집까지의 최대 금액 (현재 집 스킵) + // 2. 전전 집까지의 최대 금액 + 현재 집 금액 (현재 집 선택) + for (let i = 2; i < len; i++) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]); + } + + return dp[len - 1]; +}; diff --git a/longest-consecutive-sequence/y00eunji.js b/longest-consecutive-sequence/y00eunji.js new file mode 100644 index 000000000..56984c5e8 --- /dev/null +++ b/longest-consecutive-sequence/y00eunji.js @@ -0,0 +1,27 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var longestConsecutive = function(nums) { + const numSet = new Set(nums); + let longestStreak = 0; + + for (const num of numSet) { + // 현재 숫자가 연속 시퀀스의 시작점인지 확인 + // 즉, num-1이 set에 없어야 함 + if (!numSet.has(num - 1)) { + let currentNum = num; + let currentStreak = 1; + + // 현재 숫자의 연속된 다음 숫자들을 찾음 + while (numSet.has(currentNum + 1)) { + currentNum += 1; + currentStreak += 1; + } + + longestStreak = Math.max(longestStreak, currentStreak); + } + } + + return longestStreak; +}; diff --git a/top-k-frequent-elements/y00eunji.js b/top-k-frequent-elements/y00eunji.js new file mode 100644 index 000000000..bb8b37301 --- /dev/null +++ b/top-k-frequent-elements/y00eunji.js @@ -0,0 +1,20 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ +var topKFrequent = function(nums, k) { + // 1. nums 배열을 순회하여 각 숫자의 빈도를 계산하고 obj 객체에 저장 + const obj = nums.reduce((acc, cur) => { + acc[cur] = (acc[cur] || 0) + 1; + return acc; + }, {}); + + // 2. obj 객체의 키-값 쌍을 배열로 변환하고, 값을 기준으로 내림차순 정렬, k개 추출 + const frequentArr = Object.entries(obj) + .sort(([, valueA], [, valueB]) => valueB - valueA) + .slice(0, k) + .map(([key]) => +key); + + return frequentArr; +}; diff --git a/valid-palindrome/y00eunji.js b/valid-palindrome/y00eunji.js new file mode 100644 index 000000000..95df65d1d --- /dev/null +++ b/valid-palindrome/y00eunji.js @@ -0,0 +1,10 @@ +/** + * @param {string} s + * @return {boolean} + */ +var isPalindrome = function(s) { + const filtered = s.toLowerCase().replace(/[^a-zA-Z0-9]/g, ''); + const reversed = filtered.split('').reverse().join(''); + + return filtered === reversed; +};