Skip to content

Commit 793e1f4

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents e5950a9 + b1fb402 commit 793e1f4

24 files changed

+842
-44
lines changed

contains-duplicate/Geegong.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import java.util.HashMap;
2+
import java.util.HashSet;
3+
import java.util.Map;
4+
5+
public class Geegong {
6+
7+
8+
/**
9+
* time complexity : O(n)
10+
* space complexity : o(n)
11+
* @param nums
12+
* @return
13+
*/
14+
public boolean containsDuplicate(int[] nums) {
15+
HashSet<Integer> uniques = new HashSet<>();
16+
17+
for (int num : nums) {
18+
if (uniques.contains(num)) {
19+
return true;
20+
}
21+
22+
uniques.add(num);
23+
}
24+
25+
return false;
26+
}
27+
28+
}
29+

contains-duplicate/Yg-cho.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
var containsDuplicate = function(nums) {
6+
return new Set(nums).size !== nums.length;
7+
};
8+
9+
//console.log(containsDuplicate([1, 2, 3, 1])); // true
10+
// console.log(containsDuplicate([1, 2, 3, 4])); // false
11+
// console.log(containsDuplicate([1, 1, 1, 3, 3, 4, 3, 2, 4, 2])); // true
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
contains-duplicate
3+
요구사항: 주어진 입력에서 중복된 원소가 존재하는지 여부를 참/거짓으로 반환.
4+
접근 1: 가장 단순한 방법은 다른 vector input_list를 두고, 입력 반복마다 전체 스캔해서 중복 여부를 체크하는 것입니다.
5+
input_list의 스캔 비용 O(N)을 모든 입력에 대해 반복하므로 총 시간 복잡도는 O(N^2)입니다.
6+
공간 복잡도는 입력과 같으므로 O(N)입니다.
7+
접근 2: 원소의 존재 여부를 더 빠르게 체크하는 방법은 set을 사용하는 것입니다.
8+
set은 중복 원소를 검출하는데 효과적인 자료구조로, 내부 구현에 따라 비용과 특성이 다릅니다.
9+
- C++에서 ordered_{set, map}은 정렬을 유지하는 search tree를 사용하므로 쿼리와 삽입, 삭제 비용이 평균 O(log(N))입니다.
10+
search tree의 구현에 따라 최악의 경우 쿼리 비용이 O(N)까지 증가할 수 있습니다.
11+
- C++에서 unordered_{set, map}은 해시 및 버킷 구조를 사용합니다. 이 경우, 평균적인 쿼리, 삽입, 삭제 비용은 O(1)입니다.
12+
우리의 요구사항은 입력에 대한 별도의 정보를 저장할 필요가 없으므로 unordered_set으로 중복 검사를 수행하는 것이 비용 효율적입니다.
13+
최악의 경우 모든 입력을 확인해야 합니다. N개의 입력에 대해 각각 쿼리와 입력을 수행하므로, 총 시간 복잡도는 O(N), 공간 복잡도도 입력만큼인 O(N)입니다.
14+
*/
15+
16+
#include <unordered_set>
17+
#include <vector>
18+
19+
class Solution {
20+
public:
21+
bool containsDuplicate(std::vector<int>& nums) {
22+
std::unordered_set<int> s;
23+
24+
for (auto it = nums.begin(); it != nums.end(); it++) {
25+
int x = *it;
26+
if (s.find(x) != s.end())
27+
return true;
28+
else
29+
s.insert(x);
30+
}
31+
return false;
32+
}
33+
};

contains-duplicate/grapefruitgreentealoe.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,23 @@ var containsDuplicate = function (nums) {
2424
}
2525
return false;
2626
};
27+
28+
//25.7.23 풀이시간 10분
29+
/**
30+
* @param {number[]} nums
31+
* @return {boolean}
32+
*/
33+
var containsDuplicate = function(nums) {
34+
//두번 이상 나타나는게 있으면 바로 리턴하시오.
35+
//이중 순회하게 되면 시간 초과할 예정.
36+
//시간복잡도 중요.
37+
//1. 저장하는 배열을 만들고, 그 배열에 값이 있으면 리턴 false.
38+
//2.배열보다 Set을 사용한,삽입 및 조회 속도 최적화 활용하기.
39+
const container = new Set();
40+
for(let i =0; i<nums.length;i++){
41+
if(container.has(nums[i])) return true;
42+
else container.add(nums[i])
43+
}
44+
return false
45+
};
46+
//위의 코드보다, 리턴을 더 빨리한다는 이점이 있다.

contains-duplicate/hi-rachel.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
https://leetcode.com/problems/contains-duplicate/
3+
4+
Given an integer array nums,
5+
return true if any value appears at least twice in the array,
6+
and return false if every element is distinct.
7+
8+
TC: O(n)
9+
SC: O(n)
10+
"""
11+
12+
from typing import List
13+
14+
class Solution:
15+
def containsDuplicate(self, nums: List[int]) -> bool:
16+
seen = set()
17+
18+
for num in nums:
19+
if num in seen:
20+
return True
21+
else:
22+
seen.add(num)
23+
return False
24+
25+
26+
class Solution:
27+
def containsDuplicate(self, nums: List[int]) -> bool:
28+
return len(set(nums)) != len(nums)

contains-duplicate/minji0214.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function containsDuplicate(nums: number[]): boolean {
2+
let answer = false
3+
for(let i = 0; i< nums.length; i ++ ){
4+
if(nums.findIndex((value)=> value === nums[i]) !== i){
5+
answer = true
6+
break;
7+
}
8+
}
9+
return answer
10+
};
11+
//-> time limit 초과 오류 발생
12+
//시간복잡도
13+
// for + findIndex O(n²) ❌
14+
// for + Set or Map O(n) ✅
15+
//중복 여부만 체크할 때는 무조건 Set을 쓰는 게 효율적
16+
// includes, findIndex, indexOf는 절대 루프 안에서 쓰지 말것 — O(n²)
17+
function containsDuplicate(nums: number[]): boolean {
18+
const seen = new Set(); //지금까지 본 숫자들을 저장
19+
for (const num of nums) {
20+
if (seen.has(num)) return true; // 중복 발견
21+
seen.add(num); // 중복이 아닐 경우 추가
22+
}
23+
return false; // 중복 없음
24+
}
25+
//Set : 중복 없는 값을의 모음. 배열처럼 생겼지만, 중복을 허용하지 않음 (중복제거)
26+
//Map : key → value 형태로 저장하는 객체 (검색 수정)
27+

house-robber/grapefruitgreentealoe.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,23 @@ var rob2 = function (nums) {
4343
};
4444
//공간복잡도를 O(1)로 개선
4545

46+
47+
//7.21 풀이시간 10분 소요
48+
49+
50+
/**
51+
* @param {number[]} nums
52+
* @return {number}
53+
*/
54+
var rob = function(nums) {
55+
const dp = new Array(nums.length+1).fill(0);
56+
dp[1] = nums[0]
57+
for(let i = 2; i<=nums.length;i++){
58+
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i-1])
59+
}
60+
return dp[nums.length]
61+
};
62+
/**
63+
시간복잡도 : O(n)
64+
공간복잡도 : O(n)
65+
*/

house-robber/hi-rachel.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,38 @@
1010
# **dp[i] = max(dp[i-1], dp[i-2] + nums[i])**
1111
# nums 길이가 2인 경우 range(2, 2)는 for문 안 돈다.
1212

13+
from typing import List
14+
1315
class Solution:
1416
def rob(self, nums: List[int]) -> int:
15-
if not nums: return 0
16-
if len(nums) == 1: return nums[0]
17-
17+
if len(nums) == 1:
18+
return nums[0]
19+
1820
dp = [0] * len(nums)
1921
dp[0] = nums[0]
2022
dp[1] = max(nums[0], nums[1])
2123

2224
for i in range(2, len(nums)):
23-
dp[i] = max(dp[i - 1], nums[i] + dp[i - 2])
25+
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
2426

2527
return dp[-1]
2628

29+
"""
30+
공간 최적화 풀이
31+
32+
prev2: i-2까지의 최대값 + 현재 돈
33+
prev1: i번째 집 안 털고, 이전까지의 최대값 유지
34+
35+
TC: O(n)
36+
SC: O(1)
37+
"""
38+
class Solution:
39+
def rob(self, nums: List[int]) -> int:
40+
prev2, prev1 = 0, 0
41+
for num in nums:
42+
prev2, prev1 = prev1, max(prev1, prev2 + num)
43+
return prev1
44+
2745

2846
# TS 코드
2947
# function rob(nums: number[]): number {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.util.HashMap;
2+
import java.util.HashSet;
3+
import java.util.Map;
4+
5+
/**
6+
* time complexity : O(n)
7+
*/
8+
public class Geegong {
9+
10+
public int longestConsecutive(int[] nums) {
11+
HashSet<Integer> setOfNums = new HashSet<>();
12+
// key : startIndex , value : length
13+
Map<Integer, Integer> lengthMap = new HashMap<>();
14+
15+
// sort..? 를 해야될까 싶음..
16+
17+
// initialize
18+
for (int num : nums) {
19+
setOfNums.add(num);
20+
}
21+
22+
Integer longest = 0;
23+
24+
for (Integer num : setOfNums) {
25+
int length = iterate(setOfNums, num, 0, lengthMap);
26+
longest = Math.max(longest, length);
27+
}
28+
29+
return longest;
30+
}
31+
32+
public Integer iterate(HashSet<Integer> hashSet, int currIndex, int currLength, Map<Integer, Integer> lengthMap) {
33+
if (lengthMap.containsKey(currIndex)) {
34+
return lengthMap.get(currIndex);
35+
}
36+
37+
if (hashSet.contains(currIndex)) {
38+
currLength++;
39+
return iterate(hashSet, currIndex+1, currLength, lengthMap);
40+
41+
} else {
42+
lengthMap.put(currIndex, currLength);
43+
return currLength;
44+
}
45+
46+
}
47+
48+
}
49+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var longestConsecutive = function(nums) {
6+
if(nums.length === 0) return 0;
7+
8+
const numSet = new Set(nums);
9+
let longest = 0;
10+
11+
for (const num of numSet) {
12+
if(!numSet.has(num-1)) {
13+
let currentNum = num;
14+
let currentLength = 1;
15+
16+
while(numSet.has(currentNum+1)) {
17+
currentNum++;
18+
currentLength++;
19+
}
20+
21+
longest = Math.max(longest, currentLength)
22+
}
23+
}
24+
return longest;
25+
};

0 commit comments

Comments
 (0)