Skip to content

Commit 7641de0

Browse files
Merge branch 'DaleStudy:main' into main
2 parents 20ee693 + 651d248 commit 7641de0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1477
-172
lines changed

contains-duplicate/HoonDongKang.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* [Problem]: [217] Contains Duplicate
3+
* (https://leetcode.com/problems/contains-duplicate/description/)
4+
*/
5+
6+
function containsDuplicate(nums: number[]): boolean {
7+
// 시간복잡도: O(n^2)
8+
// 공간복잡도: O(1)
9+
const doubleLoopFunc = (nums: number[]) => {
10+
let isDuplicated = false;
11+
for (let i = 0; i < nums.length; i++) {
12+
for (let j = i + 1; j < nums.length; j++) {
13+
if (nums[i] === nums[j]) isDuplicated = true;
14+
}
15+
}
16+
return isDuplicated;
17+
};
18+
19+
// 시간복잡도: O(n)
20+
// 공간복잡도: O(n)
21+
const setFunc = (nums: number[]) => {
22+
const numsSet = new Set<number>(nums);
23+
24+
return nums.length !== numsSet.size;
25+
};
26+
27+
// 시간복잡도: O(n)
28+
// 공간복잡도: O(n)
29+
const mapFunc = (nums: number[]) => {
30+
const numsMap = new Map<number, boolean>();
31+
32+
for (const num of nums) {
33+
if (numsMap.get(num)) return true;
34+
numsMap.set(num, true);
35+
}
36+
37+
return false;
38+
};
39+
40+
return mapFunc(nums);
41+
}

contains-duplicate/KwonNayeon.py

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,23 @@
11
"""
2-
Title: 217. Contains Duplicate
3-
Link: https://leetcode.com/problems/contains-duplicate/
2+
Problem: 217. Contains Duplicate
43
5-
Summary:
6-
- 주어진 배열 `nums`에서 어떤 값이 한 번 이상 등장하면 True를 반환하고, 배열의 모든 값이 유일한 경우에는 False를 반환함
7-
- Input: `nums = [1,2,3,1]`
8-
- Output: `True`
4+
Constraints:
5+
- 1 <= nums.length <= 10^5
6+
- -10^9 <= nums[i] <= 10^9
97
10-
Conditions:
11-
- 중복이 있으면: 배열에서 적어도 하나의 값이 두 번 이상 등장하면 `True` 반환
12-
- 중복이 없으면: 배열의 모든 값이 유일하면 `False` 반환
13-
"""
8+
Time Complexity: O(n)
9+
- 배열을 한 번만 순회함
10+
- 집합에서 검색과 추가 연산은 평균적으로 O(1)
11+
- 총 n개 요소에 대해 각각 O(1) 연산 수행
1412
15-
"""
16-
First Try
17-
Time Complexity:
18-
- O(n) * O(n) = O(n^2): `for` 루프에서 `nums.count(i)`를 호출할 때마다 리스트를 순회하므로, 전체 시간 복잡도는 `O(n^2)`
19-
"""
20-
class Solution:
21-
def containsDuplicate(self, nums: List[int]) -> bool:
22-
for i in nums:
23-
if nums.count(i) > 1:
24-
return True
25-
return False
26-
27-
"""
28-
Second Try (set를 활용하여 이미 본 요소를 효율적으로 추적하는 방법)
29-
Time Complexity:
30-
- O(n): `for` 루프에서 각 숫자에 대해 `in` 연산과 `add` 연산이 상수 시간 O(1)으로 처리되므로, 전체 시간 복잡도는 O(n)
13+
Space Complexity: O(n)
14+
- 최악의 경우 모든 요소를 집합에 저장
15+
- 추가 공간이 입력 배열 크기에 비례함
3116
"""
3217
class Solution:
3318
def containsDuplicate(self, nums: List[int]) -> bool:
3419
seen = set()
20+
3521
for i in nums:
3622
if i in seen:
3723
return True

contains-duplicate/PDKhan.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
bool containsDuplicate(vector<int>& nums) {
4+
unordered_map<int, int> map;
5+
6+
for(int i = 0; i < nums.size(); i++){
7+
map[nums[i]]++;
8+
9+
if(map[nums[i]] == 2)
10+
return true;
11+
}
12+
13+
return false;
14+
}
15+
};

contains-duplicate/Tessa1217.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import java.util.HashSet;
2+
import java.util.Set;
3+
4+
class Solution {
5+
6+
/** 217. 중복된 수
7+
* 정수 배열 nums가 주어졌을 때 배열 요소 중 한 개 이상이 두 번 이상 중복되어
8+
* 나타는 경우 true를, 모든 배열의 요소가 고유한 경우 false를 반환
9+
*/
10+
public boolean containsDuplicate(int[] nums) {
11+
12+
Set<Integer> distincts = new HashSet<>();
13+
14+
for (int i = 0; i < nums.length; i++) {
15+
distincts.add(nums[i]);
16+
}
17+
18+
return distincts.size() != nums.length;
19+
}
20+
}
21+

contains-duplicate/Yn3-3xh.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
[문제풀이]
3+
time: O(N), space: O(N)
4+
- 같은 수가 하나라도 있으면 true
5+
- 모든 수가 다르면 false
6+
7+
[회고]
8+
ArrayList vs Set
9+
ArrayList: O(N^2), 매번 리스트를 처음부터 검색해야 하며, n번 반복
10+
Set : O(N) , 내부적으로 해시 테이블을 사용하여 중복 확인을 O(1)에 수행
11+
따라서 중복 검사에서 Set 더 효율적
12+
13+
set.add()의 return 자료형은 boolean 이다.
14+
이후에는 if(!set.add()) 처럼 사용해도 좋을 듯.
15+
*/
16+
class Solution {
17+
public boolean containsDuplicate(int[] nums) {
18+
Set<Integer> set = new HashSet<>();
19+
for (int num : nums) {
20+
if (set.contains(num)) {
21+
return true;
22+
}
23+
set.add(num);
24+
}
25+
return false;
26+
}
27+
}

contains-duplicate/hsskey.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
var containsDuplicate = function(nums) {
6+
return nums.length !== new Set([...nums]).size
7+
};

contains-duplicate/krokerdile.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
6+
/**
7+
* 1차 풀이
8+
* - Map을 사용하여 각 숫자의 개수를 세는 방법
9+
*/
10+
var containsDuplicate = function(nums) {
11+
let dict = new Map();
12+
13+
nums.forEach((num)=>{
14+
if(dict.has(num)){
15+
dict.set(num, dict.get(num)+1);
16+
}else{
17+
dict.set(num, 1);
18+
}
19+
})
20+
21+
for (const num of nums) {
22+
if(dict.get(num) >= 2){
23+
return true;
24+
}
25+
}
26+
return false;
27+
};
28+
29+
/**
30+
* 2차풀이
31+
* - Map을 사용하여 각 숫자의 개수를 세는 방법
32+
* - forEach를 사용하지 않고 for of문을 사용하여 반복문을 돌리는 방법
33+
*/
34+
var containsDuplicate = function(nums) {
35+
let dict = new Map();
36+
37+
for (const num of nums) {
38+
if(dict.has(num)){
39+
dict.set(num, dict.get(num)+1);
40+
}else{
41+
dict.set(num, 1);
42+
}
43+
if(dict.get(num) >= 2){
44+
return true;
45+
}
46+
}
47+
return false;
48+
};

contains-duplicate/lhc0506.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
var containsDuplicate = function(nums) {
6+
const numsSet = new Set();
7+
nums.forEach(num => numsSet.add(num));
8+
9+
return nums.length !== numsSet.size;
10+
};

contains-duplicate/mmyeon.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

contains-duplicate/mmyeon.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
*
3+
* 접근 방법 :
4+
* - set 자료구조에 nums 값 담아서 set의 크기와 배열의 길이를 비교하기
5+
*
6+
* 시간복잡도 : O(n)
7+
* - nums 배열을 순회해서 set에 저장하니까 O(n)
8+
*
9+
* 공간복잡도 : O(n)
10+
* - nums 배열의 길이만큼 set에 담으니까 O(n)
11+
*/
12+
function containsDuplicate(nums: number[]): boolean {
13+
return nums.length !== new Set(nums).size;
14+
}
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):
3+
return len(nums) != len(set(nums))

contains-duplicate/seungriyou.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# https://leetcode.com/problems/contains-duplicate/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def containsDuplicate1(self, nums: List[int]) -> bool:
7+
"""
8+
[Complexity]
9+
- TC: O(n) (set(nums) 시 원소를 복사하는 데에 O(n), len()은 O(1))
10+
- SC: O(n)
11+
12+
[Approach]
13+
set(hash map)을 이용하여 중복을 제거한 결과의 길이를 원본 리스트의 길이와 비교하면 된다.
14+
"""
15+
16+
return len(nums) != len(set(nums))
17+
18+
19+
def containsDuplicate(self, nums: List[int]) -> bool:
20+
"""
21+
[Complexity]
22+
- TC: O(n) (iteration)
23+
- SC: O(n)
24+
25+
[Approach]
26+
nums를 순회하면서 set(hash map)에 등장했던 원소를 add 하고, 동일한 원소가 발견되면 True를 반환한다.
27+
nums 전체를 순회하면서 동일한 원소가 없었다면 False를 반환한다.
28+
"""
29+
30+
seen = set()
31+
32+
for num in nums: # -- O(n)
33+
if num in seen: # -- O(1)
34+
return True
35+
seen.add(num)
36+
37+
return False

house-robber/HoonDongKang.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* [Problem]: [198] House Robber
3+
* (https://leetcode.com/problems/house-robber/description/)
4+
*/
5+
function rob(nums: number[]): number {
6+
// 시간 복잡도 O(2^n)
7+
// 공간 복잡도 O(n)
8+
// 시간 초과
9+
function recursionFunc(nums: number[]): number {
10+
function getMax(start: number): number {
11+
if (nums.length - 1 < start) return 0;
12+
return Math.max(nums[start] + getMax(start + 2), getMax(start + 1));
13+
}
14+
15+
return getMax(0);
16+
}
17+
18+
// 메모이제이션
19+
// 시간복잡도 O(n)
20+
// 공간복잡도 O(n)
21+
function memoizationFunc(nums: number[]): number {
22+
let memoArr = new Array(nums.length).fill(-1);
23+
function getMax(start: number): number {
24+
if (nums.length - 1 < start) return 0;
25+
if (memoArr[start] !== -1) return memoArr[start];
26+
27+
memoArr[start] = Math.max(nums[start] + getMax(start + 2), getMax(start + 1));
28+
29+
return memoArr[start];
30+
}
31+
32+
return getMax(0);
33+
}
34+
35+
// DP
36+
// 시간복잡도 O(n)
37+
// 공간복잡도 O(1)
38+
function dpSolution(nums: number[]): number {
39+
if (nums.length === 1) return nums[0];
40+
41+
let prev2 = 0;
42+
let prev1 = 0;
43+
44+
for (let num of nums) {
45+
let current = Math.max(prev1, prev2 + num);
46+
prev2 = prev1;
47+
prev1 = current;
48+
}
49+
50+
return prev1;
51+
}
52+
53+
return dpSolution(nums);
54+
}

house-robber/PDKhan.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int rob(vector<int>& nums) {
4+
int n = nums.size();
5+
6+
if(n == 0) return 0;
7+
if(n == 1) return nums[0];
8+
if(n == 2) return max(nums[0], nums[1]);
9+
10+
int prev2 = nums[0];
11+
int prev1 = max(nums[0], nums[1]);
12+
13+
14+
for(int i = 2; i < n; i++){
15+
int curr = max(prev1, prev2 + nums[i]);
16+
prev2 = prev1;
17+
prev1 = curr;
18+
}
19+
20+
return prev1;
21+
}
22+
};

0 commit comments

Comments
 (0)