Skip to content

Commit 7805b3a

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 93f6e8c + 8f1e53e commit 7805b3a

File tree

10 files changed

+221
-0
lines changed

10 files changed

+221
-0
lines changed

contains-duplicate/limlimjo.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
var containsDuplicate = function(nums) {
6+
7+
// 첫 번째 방법: filter + indexOf 사용 => indexOf(),filter() 각각 시간복잡도 O(n) 두 개가 중첩이므로 시간복잡도 O(n^2)
8+
// Runtime: Time Limit Exceeded 발생
9+
const method1 = function() {
10+
const filterNums = nums.filter((item,index) => nums.indexOf(item) !== index);
11+
return filterNums.length > 0;
12+
}
13+
14+
// 두 번째 방법: Set 사용 => nums 배열을 set으로 변환할 때 한번씩 확인하면 되므로 시간복잡도 O(n)
15+
// Runtime: 14ms
16+
const method2 = function() {
17+
const setNums = new Set(nums);
18+
return setNums.size !== nums.length;
19+
}
20+
21+
// 위 두 가지 방법 중 Set을 사용하는 것이 성능상 훨씬 나음
22+
return method2();
23+
};

contains-duplicate/pmjuu.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class Solution:
2+
def containsDuplicate(self, nums: List[int]) -> bool:
3+
return len(nums) != len(set(nums))

house-robber/limlimjo.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var rob = function(nums) {
6+
// 1. nums 배열 0일 때와 1일 때
7+
if (nums.length === 0) return 0;
8+
if (nums.length === 1) return nums[0];
9+
10+
// 2. i=1일 때
11+
nums[1] = Math.max(nums[0], nums[1]);
12+
13+
// 3. i=2일 때부터 for문 순회
14+
for (let i=2; i<nums.length; i++) {
15+
nums[i] = Math.max(nums[i-2] + nums[i], nums[i-1])
16+
}
17+
return nums[nums.length-1];
18+
};
19+
20+
// 시간복잡도와 공간복잡도
21+
// 시간복잡도: 배열의 길이 n 만큼 for문 순회하므로 -> O(n)
22+
// 공간복잡도: nums 배열 그대로 수정하여 계산 -> O(1)

house-robber/pmjuu.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from typing import List
2+
3+
class Solution:
4+
def rob(self, nums: List[int]) -> int:
5+
if len(nums) == 1:
6+
return nums[0]
7+
8+
# prev1: 이전 집까지의 최대 이익
9+
# prev2: 전전 집까지의 최대 이익
10+
prev1, prev2 = 0, 0
11+
for num in nums:
12+
temp = prev1
13+
prev1 = max(prev2 + num, prev1) # 현재 집을 털었을 때와 안 털었을 때 중 더 큰 이익 선택
14+
prev2 = temp
15+
16+
return prev1
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var longestConsecutive = function(nums) {
6+
// 첫 번째 정렬을 한다.
7+
if (nums.length === 0) {
8+
return 0;
9+
}
10+
11+
nums.sort((a, b) => a - b); // 오름차순으로 정렬
12+
console.log(nums);
13+
14+
// 두 번째 숫자가 1씩 계속해서 증가하는 구간을 찾는다.
15+
let longest = 0;
16+
let length = 1;
17+
18+
for (let i=0; i<nums.length-1; i++) {
19+
if (nums[i] === nums[i+1]) {
20+
continue;
21+
}
22+
// 연속해서 1씩 증가하는 구간 찾기
23+
if (nums[i+1] - nums[i] === 1) {
24+
length += 1;
25+
} else {
26+
longest = Math.max(longest, length);
27+
length = 1;
28+
}
29+
}
30+
return Math.max(longest, length);
31+
};
32+
33+
// 시간복잡도와 공간복잡도
34+
// 시간복잡도: 정렬 사용(O(nlogn)) + for문으로 배열 탐색(O(n)) = O(nlogn)
35+
// 공간복잡도: O(1)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import List
2+
3+
class Solution:
4+
def longestConsecutive(self, nums: List[int]) -> int:
5+
# Convert to set for O(1) lookups
6+
num_set = set(nums)
7+
longest_length = 0
8+
9+
for num in num_set:
10+
# Only start counting if num is the start of a sequence
11+
if num - 1 not in num_set:
12+
current_num = num
13+
current_length = 1
14+
15+
# Count the length of the sequence
16+
while current_num + 1 in num_set:
17+
current_num += 1
18+
current_length += 1
19+
20+
longest_length = max(longest_length, current_length)
21+
22+
return longest_length
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number[]}
5+
*/
6+
var topKFrequent = function(nums, k) {
7+
let map = new Map(); // key에는 해당되는 숫자, value에는 해당되는 숫자의 갯수
8+
9+
// 숫자별 빈도수
10+
nums.forEach((num) => {
11+
map.set(num, (map.get(num) || 0) + 1);
12+
});
13+
14+
// 결과를 배열로 바꿔주고 내림차순 정렬
15+
let sortedResult = Array.from(map.entries()).sort((a,b) => b[1] - a[1]);
16+
//console.log(sortedResult);
17+
//console.log(sortedResult.slice(0,k));
18+
19+
// k갯수의 숫자 반환
20+
return sortedResult.slice(0,k).map(item => item[0]);
21+
};
22+
23+
// 여기서 위 코드의 시간복잡도와 공간복잡도를 생각해보자...
24+
// 시간복잡도 => O(m log m) ** 더 개선할 방법 찾아보기
25+
// forEach 통한 배열 순회: 배열의 크기가 n이라고 한다면 O(n)
26+
// sortedResult (정렬): O(m log m)
27+
// k갯수의 숫자 반환: k개 항목에 대해 연산하니까 O(k)
28+
29+
// 공간복잡도 => O(n)
30+
// map의 크기: 배열의 크기가 n이라고 한다면 O(n)
31+
// sortedResult: O(m)
32+
// k개 숫자 저장: O(k)

top-k-frequent-elements/pmjuu.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from collections import Counter
2+
from typing import List
3+
4+
class Solution:
5+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
6+
# 빈도 계산
7+
count = Counter(nums)
8+
n = len(nums)
9+
10+
# 빈도수를 기준으로 버킷 생성 (0에서 n까지)
11+
buckets = [[] for _ in range(n + 1)]
12+
13+
# 각 숫자를 해당 빈도수의 버킷에 추가
14+
for num, freq in count.items():
15+
buckets[freq].append(num)
16+
17+
# 빈도가 높은 순서대로 k개의 숫자를 추출
18+
result = []
19+
for freq in range(n, 0, -1):
20+
if buckets[freq]:
21+
result.extend(buckets[freq])
22+
23+
if len(result) == k:
24+
return result

valid-palindrome/limlimjo.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @param {string} s
3+
* @return {boolean}
4+
*/
5+
var isPalindrome = function(s) {
6+
// 1. 문자열을 다 소문자로 바꾸고, 알파벳/숫자 아닌 거 다 제거
7+
if (s.length === 1) {
8+
return true;
9+
} else {
10+
let lcLetter = s.toLowerCase().replace(/[^a-z0-9]/g, '');
11+
//console.log(lcLetter);
12+
13+
// 2. 문자열이 앞에서 시작할 때와 뒤에서 시작할 때 같으면 true, 아니면 false
14+
if(lcLetter) {
15+
for(let i=0; i<Math.floor(lcLetter.length/2); i++) {
16+
if (lcLetter[i] !== lcLetter[lcLetter.length - 1 - i]) return false;
17+
}
18+
return true;
19+
} else {
20+
return true;
21+
}
22+
}
23+
};

valid-palindrome/pmjuu.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def isPalindrome(self, s: str) -> bool:
3+
# two pointer
4+
left, right = 0, len(s) - 1
5+
6+
while left < right:
7+
# compare only alphanumeric characters
8+
while left < right and not s[left].isalnum():
9+
left += 1
10+
while left < right and not s[right].isalnum():
11+
right -= 1
12+
13+
# compare with lowercase
14+
if s[left].lower() != s[right].lower():
15+
return False
16+
17+
# move pointers
18+
left += 1
19+
right -= 1
20+
21+
return True

0 commit comments

Comments
 (0)