Skip to content

Commit c06495a

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents d966946 + c3118a9 commit c06495a

File tree

333 files changed

+8958
-659
lines changed

Some content is hidden

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

333 files changed

+8958
-659
lines changed

3sum/KwonNayeon.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,35 @@
33
1. 3 <= nums.length <= 3000
44
2. -10^5 <= nums[i] <= 10^5
55
6-
Time Complexity:
7-
- O(n^2) (정렬은 O(n log n), 이중 반복문은 O(n^2))
8-
Space Complexity:
9-
- O(n) (결과 리스트)
6+
Time Complexity: O(n^2)
7+
- 정렬은 O(n log n), 이중 반복문은 O(n^2)
8+
Space Complexity: O(n)
9+
- 결과 리스트를 저장하는 데 필요한 공간
10+
11+
풀이 방법:
12+
- 투 포인터를 활용하여 합이 0이 되는 세 수 조합 찾기
13+
- 배열 정렬: 투 포인터 사용 + 중복 처리 용이
14+
- for 루프: 첫 번째 숫자 선택 (len(nums)-2까지)
15+
- 중복된 첫 번째 숫자 건너뛰기
16+
- left, right 포인터 설정
17+
- while 루프: 두 포인터가 교차하지 않아야 함
18+
- sum = nums[i] + nums[left] + nums[right] 계산
19+
- sum == 0: 결과 추가, 중복 건너뛰기, 양쪽 포인터 이동
20+
- sum < 0: left 증가 (더 큰 값 필요)
21+
- sum > 0: right 감소 (더 작은 값 필요)
22+
- 최종 결과 반환
1023
"""
24+
# Brute-force: three nested loops → O(n^3)
25+
# Optimized: sort + two pointer → O(n^2)
1126

1227
class Solution:
1328
def threeSum(self, nums: List[int]) -> List[List[int]]:
29+
# Step 1: Sort the array
30+
# Step 2: Fix one number using for loop
31+
# Step 3: Use two pointers to find two other numbers
32+
# - if sum == 0: valid triplet
33+
# - if sum < 0: move left pointer
34+
# - if sum > 0: move right pointer
1435
nums.sort()
1536
result = []
1637

3sum/PDKhan.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> threeSum(vector<int>& nums) {
4+
vector<vector<int>> result;
5+
sort(nums.begin(), nums.end());
6+
7+
for(int i = 0; i < nums.size(); i++){
8+
if(i > 0 && nums[i] == nums[i-1])
9+
continue;
10+
11+
int left = i + 1;
12+
int right = nums.size() - 1;
13+
14+
while(left < right){
15+
int sum = nums[i] + nums[left] + nums[right];
16+
17+
if(sum == 0){
18+
result.push_back({nums[i], nums[left], nums[right]});
19+
left++;
20+
right--;
21+
22+
while(left < right && nums[left] == nums[left-1])
23+
left++;
24+
25+
while(left < right && nums[right] == nums[right+1])
26+
right--;
27+
}else if(sum < 0)
28+
left++;
29+
else
30+
right--;
31+
}
32+
}
33+
34+
return result;
35+
}
36+
};

3sum/Tessa1217.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.List;
2+
import java.util.ArrayList;
3+
import java.util.Arrays;
4+
5+
// 정수 배열 nums가 주어질 때 nums[i], nums[j], nums[k]로 이루어진 배열을 반환하시오
6+
// 반환 배열 조건: i 가 j와 같지 않고, i가 k와 같지 않으며 세 요소의 합이 0인 배열
7+
class Solution {
8+
9+
// 시간복잡도: O(n^2)
10+
public List<List<Integer>> threeSum(int[] nums) {
11+
12+
Arrays.sort(nums);
13+
14+
List<List<Integer>> answer = new ArrayList<>();
15+
16+
int left = 0;
17+
int right = 0;
18+
int sum = 0;
19+
20+
for (int i = 0; i < nums.length - 2 && nums[i] <= 0; i++) {
21+
22+
// 중복 제거
23+
if (i > 0 && nums[i] == nums[i - 1]) {
24+
continue;
25+
}
26+
27+
left = i + 1;
28+
right = nums.length - 1;
29+
30+
while (left < right) {
31+
32+
sum = nums[i] + nums[left] + nums[right];
33+
// System.out.println(String.format("%d, %d, %d", i, left, right));
34+
// System.out.println(String.format("%d + %d + %d = %d", nums[i], nums[left], nums[right], sum));
35+
if (sum < 0) {
36+
left++;
37+
continue;
38+
}
39+
if (sum > 0) {
40+
right--;
41+
continue;
42+
}
43+
44+
answer.add(List.of(nums[i], nums[left], nums[right]));
45+
46+
// 중복 제거
47+
while (left < right && left + 1 < nums.length && nums[left] == nums[left + 1]) {
48+
left++;
49+
}
50+
while (left < right && right - 1 >= 0 && nums[right] == nums[right - 1]) {
51+
right--;
52+
}
53+
left++;
54+
right--;
55+
56+
}
57+
}
58+
59+
return answer;
60+
}
61+
62+
}
63+

3sum/ayosecu.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from typing import List
2+
3+
class Solution:
4+
"""
5+
- Algorithm
6+
- Sort and compares with three pointers: target, left(l), right(r)
7+
- Time Complexity: O(n^2), n = len(nums)
8+
- sort : O(nlogn)
9+
- nested two loops : O(n^2)
10+
- O(nlogn + n^2) => O(n^2)
11+
- Space Complexity: O(n^2) if result included.
12+
- result size : result.append() called in n^2 times (nested two loops)
13+
"""
14+
def threeSum(self, nums: List[int]) -> List[List[int]]:
15+
result = []
16+
nums.sort()
17+
18+
n = len(nums)
19+
for i in range(n - 2):
20+
# skip duplicated numbers
21+
if i > 0 and nums[i] == nums[i - 1]:
22+
continue
23+
24+
target = nums[i]
25+
l, r = i + 1, n - 1
26+
while l < r:
27+
if nums[l] + nums[r] == -target:
28+
result.append([target, nums[l], nums[r]])
29+
# skip duplicated numbers
30+
while l < r and nums[l] == nums[l + 1]:
31+
l += 1
32+
while l < r and nums[r] == nums[r - 1]:
33+
r -= 1
34+
l += 1
35+
r -= 1
36+
elif nums[l] + nums[r] < -target:
37+
l += 1
38+
else:
39+
r -= 1
40+
41+
return result
42+
43+
tc = [
44+
([-1,0,1,2,-1,-4], [[-1,-1,2],[-1,0,1]]),
45+
([0,1,1], []),
46+
([0,0,0], [[0,0,0]])
47+
]
48+
49+
for i, (nums, e) in enumerate(tc, 1):
50+
sol = Solution()
51+
r = sol.threeSum(nums)
52+
print(f"TC {i} is Passed!" if e == r else f"TC {i} is Failed! - Expected: {e}, Result: {r}")

3sum/eunhwa99.java

Lines changed: 25 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,34 @@
22
import java.util.Arrays;
33
import java.util.List;
44

5-
/**
6-
* 문제 풀이
7-
*/
8-
// -4 -1 -1 0 2 2
9-
// p1 p2 p3 sum < 0 -> p2 앞으로
10-
// p1 p2 p3 sum < 0 -> p2 앞으로
11-
// p1 p2 p3 sum < 0 -> p2 앞으로
12-
// p1 p2p3 sum = 0 -> p1 앞으로
13-
// p1 p2 p3 sum = 0 -> p3 값 다른 게 나올 때까지 이동
14-
// p1 p2 p3 sum < 0 -> p2 앞으로 인데, p2 > p3 되므로 p1 앞으로
15-
// p1 p2 p3 sum = 0 반복
16-
17-
/**
18-
* 시간/공간 복잡도
19-
*/
20-
// 시간 복잡도 - 순회 횟수: n + (n-1) + (n-2) + .. => O(N^2)
21-
// 공간 복잡도 - 배열을 정렬하는 데 O(n log n)의 공간 + 결과를 저장하는 answer 리스트는 문제의 요구에 따라 O(k)의 공간 = O(n log n) (배열 정렬을 위한 공간) + O(k) (결과 저장 공간)
22-
23-
class Solution {
24-
public List<List<Integer>> threeSum(int[] nums) {
25-
Arrays.sort(nums); // Sort the array first
26-
List<List<Integer>> answer = new ArrayList<>();
27-
28-
for (int pointer1 = 0; pointer1 < nums.length - 2; pointer1++) {
29-
// pointer1 의 중복 값 skip
30-
if (pointer1 > 0 && nums[pointer1] == nums[pointer1 - 1]) {
31-
continue;
32-
}
33-
34-
int pointer2 = pointer1 + 1; // pointer2 는 pointer1 의 한 칸 앞
35-
int pointer3 = nums.length - 1; // pointer3 는 끝에서 부터
36-
37-
while (pointer2 < pointer3) {
38-
int sum = nums[pointer1] + nums[pointer2] + nums[pointer3];
39-
40-
if (sum < 0) {
41-
pointer2++;
42-
} else if (sum > 0) {
43-
pointer3--;
5+
// 시간 복잡도: O(n^2) - nums 배열을 정렬하는 데 O(nlogn) 소요, 이후 이중 포인터로 O(n^2)
6+
// 공간 복잡도: O(1) - 결과 리스트를 제외한 추가 공간 사용 없음
7+
class Solution{
8+
public List<List<Integer>> threeSum(int[] nums){
9+
Arrays.sort(nums);
10+
11+
List<List<Integer>> result = new ArrayList<>();
12+
13+
for(int i=0;i<nums.length-2;i++){
14+
if(i>0 && nums[i] == nums[i-1]) continue; // 중복된 값 건너뛰기
15+
int left = i+1;
16+
int right = nums.length-1;
17+
18+
while(left < right){
19+
int sum = nums[i] + nums[left] + nums[right];
20+
if(sum == 0){
21+
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
22+
while(left < right && nums[left] == nums[left+1]) left++; // 중복된 값 건너뛰기
23+
while(left < right && nums[right] == nums[right-1]) right--; // 중복된 값 건너뛰기
24+
left++;
25+
right--;
26+
} else if(sum < 0){
27+
left++;
4428
} else {
45-
// sum == 0
46-
answer.add(Arrays.asList(nums[pointer1], nums[pointer2], nums[pointer3]));
47-
48-
// pointer2 중복 값 제거
49-
while (pointer2 < pointer3 && nums[pointer2] == nums[pointer2 + 1]) {
50-
pointer2++;
51-
}
52-
53-
// pointer3 중복 값 제거
54-
while (pointer2 < pointer3 && nums[pointer3] == nums[pointer3 - 1]) {
55-
pointer3--;
56-
}
57-
58-
// 두 값 모두 move
59-
pointer2++;
60-
pointer3--;
29+
right--;
6130
}
6231
}
6332
}
64-
65-
return answer;
33+
return result;
6634
}
6735
}
68-
69-

3sum/jiji-hoon96.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number[][]}
4+
*
5+
* 풀이 1
6+
*
7+
* 이렇게 푸니까 시간복잡도 O(n^3) / 공간복잡도 O(n) 라서 복잡한 예시에는 time limit 이 발생함
8+
* 개선해보자..
9+
*
10+
* function threeSum(nums: number[]): number[][] {
11+
* nums.sort((a, b) => a - b);
12+
* let result = []
13+
* for (let i= 0; i<nums.length; i++){
14+
* for(let j= i+1 ; j <nums.length; j++){
15+
* for (let k = j+1; k<nums.length; k++){
16+
* if(nums[i]+nums[j]+nums[k]===0){
17+
* result.push([nums[i], nums[j], nums[k]]);
18+
* }
19+
* }
20+
* }
21+
* }
22+
*
23+
* return Array.from(
24+
* new Set(result.map(item => JSON.stringify(item))),
25+
* str => JSON.parse(str)
26+
* );
27+
* }
28+
*
29+
* 풀이 2
30+
*
31+
* 투포인터를 활용해보자.
32+
* 아래처럼 문제를 풀게되면 시간복잡도 O(n^2) / 공간복잡도 O(1) 이다.
33+
* 시공간 복잡도가 줄긴하지만 메모리 사용량과 큰 숫자를 다룰 때 성능이 매우 좋다!
34+
*/
35+
36+
37+
function threeSum(nums: number[]): number[][] {
38+
let result : number[][] = []
39+
nums.sort((a, b) => a - b);
40+
const n = nums.length;
41+
42+
for(let first = 0; first<n-2; first++){
43+
// 첫번째가 양수면 0이 될 수 없음
44+
if(nums[first] > 0) break;
45+
46+
//중복된 수는 건너뜀
47+
if(first > 0 && nums[first]===nums[first-1]) continue;
48+
49+
let left = first + 1;
50+
let right = n-1;
51+
52+
while(left < right){
53+
const sum = nums[first] +nums[left] + nums[right];
54+
55+
if(sum < 0){
56+
left ++
57+
}else if(sum > 0){
58+
right --;
59+
}else{
60+
result.push([nums[first],nums[left],nums[right]]);
61+
// left, left+1 이 같을 때 중복된 수는 건너뜀
62+
while(left < right && nums[left] === nums[left+1]) left++;
63+
// right, right+1 이 같을 때 중복된 수는 건너뜀
64+
while(left < right && nums[right] === nums[right-1]) right--;
65+
left++;
66+
right--;
67+
}
68+
}
69+
}
70+
return result;
71+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function maxProfit(prices: number[]): number {
2+
let minPrice = Infinity;
3+
let maxProfit = 0;
4+
for (let i = 0; i < prices.length; i++) {
5+
if (prices[i] < minPrice) {
6+
minPrice = prices[i];
7+
}
8+
9+
if (prices[i] - minPrice > maxProfit) {
10+
maxProfit = prices[i] - minPrice;
11+
}
12+
}
13+
return maxProfit;
14+
}

climbing-stairs/PDKhan.cpp

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

0 commit comments

Comments
 (0)