Skip to content

Commit 266eccf

Browse files
Merge branch 'DaleStudy:main' into main
2 parents d9f1e39 + e0d7d23 commit 266eccf

File tree

11 files changed

+240
-0
lines changed

11 files changed

+240
-0
lines changed

contains-duplicate/EstherKim97.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.
2+
3+
def containsDuplicate(nums):
4+
seen = set()
5+
for num in nums:
6+
if num in seen:
7+
return True
8+
seen.add(num)
9+
return False
10+

contains-duplicate/Yjason-K.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Set 자료구조를 사용하여 중복 확인 (시간 복잡도: O(n) )
3+
* @param nums 중복 검사할 숫자 배열
4+
* @returns boolean 중복 여부
5+
*/
6+
7+
function containsDuplicate(nums: number[]): boolean {
8+
let unique: Set<number> = new Set([]);
9+
for (const num of nums) {
10+
if (unique.has(num)) {
11+
return true
12+
} else {
13+
unique.add(num)
14+
}
15+
}
16+
return false;
17+
};
18+

contains-duplicate/hancrysta1.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.util.*;
2+
class Solution {
3+
public boolean containsDuplicate(int[] nums) {
4+
Set<Integer> numSet = Arrays.stream(nums).boxed().collect(Collectors.toSet());
5+
if(numSet.size()!=nums.length) return true;
6+
else return false;
7+
}
8+
}

house-robber/Yjason-K.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* 주어진 배열에서 인접한 집을 털지 않고 훔칠 수 있는 최대 금액을 계산하는 함수
3+
* - 시간 복잡도: O(n)
4+
* - 배열을 한 번 순회하면서 최대 금액을 계산
5+
* - 공간 복잡도: O(1)
6+
* - 추가 배열 없이 변수만 사용하여 공간 효율성을 최적화
7+
*
8+
* @param {number[]} nums - 각 집에 있는 돈의 양을 나타내는 배열
9+
* @returns {number} - 경보를 울리지 않고 훔칠 수 있는 최대 금액
10+
*/
11+
function rob(nums: number[]): number {
12+
if (nums.length === 0) return 0; // 빈 배열 처리
13+
if (nums.length === 1) return nums[0]; // 집이 한 채만 있는 경우, 그 집의 돈 반환
14+
15+
// 1. 변수 초기화: 이전 두 집까지의 최대 금액
16+
let prev2 = 0; // 두 번째 이전 집까지의 최대 금액
17+
let prev1 = nums[0]; // 첫 번째 이전 집까지의 최대 금액
18+
19+
// 2. 배열 순회: 각 집에서 훔칠 수 있는 최대 금액 계산
20+
for (let i = 1; i < nums.length; i++) {
21+
// 현재 집까지의 최대 금액은 (현재 집 + prev2) 또는 prev1 중 더 큰 값
22+
const cur = Math.max(nums[i] + prev2, prev1);
23+
24+
// 이전 두 집의 최대 금액 업데이트
25+
prev2 = prev1;
26+
prev1 = cur;
27+
}
28+
29+
return prev1; // 마지막 집까지의 최대 금액 반환
30+
}
31+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* 주어진 배열에서 가장 긴 연속된 숫자 시퀀스의 길이를 반환하는 함수
3+
* - 시간 복잡도: O(n)
4+
* - O(n): Set에 숫자를 추가하고, 각 숫자를 순회하면서 연속된 시퀀스를 계산
5+
* - 공간 복잡도: O(n)
6+
* - O(n): 숫자를 저장하기 위한 Set 사용
7+
*
8+
* @param {number[]} nums - 정수 배열
9+
* @returns {number} - 가장 긴 연속된 숫자 시퀀스의 길이
10+
*/
11+
function longestConsecutive(nums: number[]): number {
12+
if (nums.length === 0) return 0; // 빈 배열 처리 (길이 0 반환)
13+
14+
// 1. 배열을 Set에 저장하여 중복을 제거하고 빠른 조회를 가능하게 함 O(n)
15+
const numSet = new Set(nums);
16+
17+
let longestSeq = 0; // 가장 긴 연속 시퀀스 길이를 저장할 변수
18+
19+
// 2. 각 숫자가 시퀀스의 시작점인지 확인
20+
for (const num of numSet) {
21+
// 숫자 `num`이 시퀀스의 시작점인지 확인
22+
// (num-1이 Set에 없다면 num은 시퀀스의 시작점)
23+
if (!numSet.has(num - 1)) {
24+
// 새로운 시퀀스 시작
25+
let curNum = num;
26+
let curSeq = 1;
27+
28+
// 3. 시퀀스가 끝날 때까지 길이를 계산 O(n)
29+
while (numSet.has(curNum + 1)) {
30+
curNum += 1; // 현재 숫자를 1 증가
31+
curSeq += 1; // 시퀀스 길이를 1 증가
32+
}
33+
34+
// 4. 가장 긴 시퀀스 길이를 업데이트
35+
longestSeq = Math.max(longestSeq, curSeq);
36+
}
37+
}
38+
39+
return longestSeq; // 가장 긴 연속 시퀀스의 길이 반환
40+
}
41+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution(object):
2+
def topKFrequent(self, nums, k):
3+
unique_no = set(nums)
4+
data = []
5+
6+
for i in unique_no:
7+
count = 0
8+
for j in nums:
9+
if i == j:
10+
count += 1
11+
data.append((count, i))
12+
13+
data = sorted(data, reverse=True, key=lambda x:[1])
14+
15+
return [x[1] for x in data[:k]]
16+

top-k-frequent-elements/Yjason-K.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* 배열에서 각 숫자의 빈도를 계산한 후 상위 k개의 빈도 요소를 반환하는 함수
3+
* - 시간 복잡도: O(n + m log m)
4+
* - O(n): 숫자 빈도를 계산하는 루프
5+
* - O(m log m): 고유 숫자(m)에 대한 정렬
6+
* - 공간 복잡도: O(m)
7+
* - 고유 숫자(m)에 비례한 Map과 정렬된 배열 사용
8+
*
9+
* @param {number[]} nums - 숫자 배열
10+
* @param {number} k - 반환할 상위 빈도 요소의 개수
11+
* @returns {number[]} 상위 k개의 빈도 요소 (순서는 상관 없음)
12+
*/
13+
function topKFrequent(nums: number[], k: number): number[] {
14+
let numMap = new Map(); // 숫자의 빈도를 저장할 Map
15+
16+
// 1. 숫자 빈도 Map 생성 O(n)
17+
for (const num of nums) {
18+
// Map에 현재 숫자가 없으면 1로 초기화, 있으면 1 증가
19+
const value = numMap.get(num) ? numMap.get(num) + 1 : 1;
20+
numMap.set(num, value);
21+
}
22+
23+
// 2. Map을 [숫자, 빈도수] 배열로 변환한 뒤 빈도수 기준 내림차순 정렬 O(m log m)
24+
const sortedFrequent = [...numMap.entries()] // Map을 배열로 변환
25+
.sort((a, b) => b[1] - a[1]) // 빈도수 기준 내림차순 정렬
26+
27+
// 3. 상위 k개의 숫자만 추출 O(k)
28+
.slice(0, k)
29+
30+
// 4. 숫자(key)만 추출 O(k)
31+
.map(entry => entry[0]);
32+
33+
return sortedFrequent;
34+
}
35+
36+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import java.util.*;
2+
class Solution {
3+
public int[] topKFrequent(int[] nums, int k) {
4+
Map<Integer,Integer> count = new HashMap<>();
5+
for(int i=0;i<nums.length;i++){
6+
count.put(nums[i],count.getOrDefault(nums[i],0)+1);
7+
}
8+
List<Integer> sortedCount = new ArrayList<>(count.keySet());
9+
sortedCount.sort((a,b)->count.get(b)-count.get(a));//value 기준 키 정렬
10+
int[] answer = new int[k];
11+
for(int i=0;i<k;i++){
12+
answer[i] = sortedCount.get(i);
13+
}
14+
15+
return answer;
16+
}
17+
}

valid-palindrome/EstherKim97.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution(object):
2+
def isPalindrome(self, s):
3+
import re
4+
# remove all non-alphanumeric characters
5+
s = re.sub(r'\W+', '', s.lower())
6+
7+
# check if the string is equal forward and backward
8+
for i in range(len(s)//2):
9+
if s[i] != s[-(i+1)]:
10+
return False
11+
return True
12+

valid-palindrome/Yjason-K.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* 문자열을 알파벳 대문자를 소문자로 변환 및 숫자만 남기는 변환 유틸
3+
* - 시간 복잡도: O(n) (입력된 문자열의 길이에 비례)
4+
*
5+
* @param {string} s - 정제할 물자열
6+
* @returns {string} - 소문자 알파벳과 숫자로 이루어진 문자열
7+
*/
8+
const refinePhrase = (s:string) : string => s.toLowerCase().replace(/[^a-z0-9]/g, '');
9+
10+
11+
/**
12+
* 문자열을 정제후 palindrome 여부 확인 하는 함수
13+
* - 시간 복잡도: O(n) (문자열 정제 + 투 포인터 알고리즘)
14+
*
15+
* @param {string} s palindrome 여부를 확인할 문자열
16+
* @returns {boolean} palindrome 여부
17+
*/
18+
function isPalindrome(s: string): boolean {
19+
const refined = refinePhrase(s);
20+
21+
// two pointer를 활용한 palindrome 확인 O(n)
22+
let left = 0, right = refined.length - 1;
23+
while (left < right) {
24+
if (refined[left] !== refined[right]) {
25+
return false;
26+
}
27+
left++;
28+
right--;
29+
}
30+
31+
return true;
32+
}
33+

0 commit comments

Comments
 (0)