Skip to content

Commit acd7746

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 8fb5a4b + f8a2b19 commit acd7746

File tree

8 files changed

+227
-0
lines changed

8 files changed

+227
-0
lines changed

3sum/Gotprgmer.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// 이전에 투포인터를 활용하여 시도했지만 중복된 값들을 처리하는데 어려움이 있었습니다.
2+
// 그래서 해답을 보았고 새로운 방법으로 풀어보았습니다.
3+
// 서로 다른 i와 j 인덱스를 2중 for문으로 진행하면서
4+
// i와 j사이 수들을 set으로 관리합니다.
5+
// set에 -nums[i]-nums[j]가 존재하면 결과 리스트에 추가합니다.
6+
// 시간복잡도 : O(N^2)
7+
// 공간복잡도 : O(N)
8+
class SolutionGotprgmer {
9+
public List<List<Integer>> threeSum(int[] nums) {
10+
// 결과를 저장할 리스트
11+
List<List<Integer>> result = new ArrayList<>();
12+
Set<Integer> set;
13+
Set<List<Integer>> resultSet = new HashSet<>();
14+
List<Integer> numList;
15+
16+
17+
// 리스트 정렬
18+
Arrays.sort(nums);
19+
for(int i=0;i<nums.length-2;i++){
20+
if (i > 0 && nums[i - 1] == nums[i]) continue;
21+
22+
set = new HashSet<>();
23+
for(int j=i+1;j<nums.length;j++){
24+
int checkNum = nums[i]+nums[j];
25+
if(set.contains(-checkNum)){
26+
numList = new ArrayList<>(Arrays.asList(nums[i], -checkNum, nums[j]));
27+
if(!resultSet.contains(numList)){
28+
result.add(numList);
29+
resultSet.add(numList);
30+
}
31+
}
32+
set.add(nums[j]);
33+
}
34+
}
35+
return result;
36+
}
37+
}

3sum/higeuni.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// complexity
2+
// time: O(n^2)
3+
// - sort: O(n log n)
4+
// - for loop: O(n)
5+
// - while loop: O(n)
6+
// space: O(n)
7+
// - sortedNums: O(n)
8+
// - else : O(1)
9+
10+
var threeSum = function(nums) {
11+
const sortedNums = nums.sort((a, b) => a - b)
12+
const lengthOfArray = nums.length;
13+
const answer = [];
14+
15+
for(let i = 0; i < lengthOfArray; i++ ) {
16+
if (i > 0 && nums[i] === nums[i - 1]) continue;
17+
const target = (-1) * sortedNums[i];
18+
19+
let left = i + 1;
20+
let right = lengthOfArray - 1;
21+
22+
while(left < right) {
23+
const sumOfLeftAndRight = sortedNums[left] + sortedNums[right];
24+
const diff = sumOfLeftAndRight - target;
25+
26+
if( diff > 0 ){
27+
right -= 1;
28+
} else if ( diff < 0 ){
29+
left += 1
30+
} else {
31+
answer.push([sortedNums[i], sortedNums[left], sortedNums[right]]);
32+
// 중복되는 부분을 처리하는 과정에서 계속 fail되어 찾아보니 이렇게 해야 통과되었다.
33+
while(left < right && sortedNums[left] === sortedNums[left + 1]) left ++;
34+
while(left < right && sortedNums[right] === sortedNums[right - 1]) right --;
35+
36+
left++;
37+
right--;
38+
}
39+
}
40+
}
41+
return answer
42+
};
43+

climbing-stairs/Gotprgmer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// dp문제
2+
// i번째 계단을 가려면 i-1번째 계단까지의 경우의 수와 i-2번째 계단까지의 경우의 수를 합친 것
3+
// 시간복잡도 : O(N)
4+
// 공간복잡도 : O(N)
5+
class Solution {
6+
public int climbStairs(int n) {
7+
int[] dp = new int[n+1];
8+
dp[0] = 1;
9+
dp[1] = 1;
10+
for(int i=2;i<n+1;i++){
11+
dp[i] = dp[i-1]+dp[i-2];
12+
}
13+
return dp[n];
14+
15+
}
16+
}

climbing-stairs/higeuni.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// complexity
2+
// time: O(n)
3+
// - for loop: O(n)
4+
// space: O(1)
5+
// - n에 관계없이 상수개의 변수만 사용되므로 O(1)
6+
7+
var climbStairs = function(n) {
8+
let num1 = 1;
9+
let num2 = 1;
10+
let temp = 0;
11+
12+
for(let i = 2; i<=n; ++i ) {
13+
temp = num2;
14+
num2 = num1 + num2;
15+
num1 = temp;
16+
}
17+
18+
return num2;
19+
};
20+

house-robber/Gotprgmer.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// 해당 문제는 dfs로 풀이 하던 도중, 시간제한으로 풀지 못하였습니다.
2+
// 이후 답을 참고하였고, 메모이제이션을 떠올리게 되었습니다.
3+
// 풀이 아이디어는 i번째 인덱스를 선택한 합과 i+1번째 인덱스를 선택한 합중에 큰 것을 선택하는 것이 가장 큰 아이디어 였습니다.
4+
// 그런데 중복된 과정이 존재하기에 메모이제이션을 활용하여
5+
// 원래는 O(2^N)의 시간복잡도를
6+
// 각 인덱스에 해당하는 함수호출을 1번씩만 하도록 유도하여 시간복잡도를 해결하였습니다.
7+
// 시간복잡도 : O(N)
8+
// 공간복잡도 : O(N)
9+
10+
class SolutionGotprgmer {
11+
static int[] memo;
12+
static int answer;
13+
public int rob(int[] nums) {
14+
answer = 0;
15+
memo = new int[nums.length];
16+
for(int i=0;i<nums.length;i++){
17+
memo[i] = -1;
18+
}
19+
return dfs(nums,0);
20+
}
21+
public int dfs(int[] nums, int idx){
22+
if(idx<nums.length){
23+
24+
if(memo[idx] != -1){
25+
return memo[idx];
26+
}
27+
else{
28+
memo[idx] = Math.max(nums[idx]+dfs(nums,idx+2),dfs(nums,idx+1));
29+
return memo[idx];
30+
}
31+
}
32+
else{
33+
return 0;
34+
}
35+
36+
37+
}
38+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import java.util.*;
2+
class SolutionGotprgmer {
3+
public int longestConsecutive(int[] nums) {
4+
Set<Integer> set = new HashSet<>();
5+
for(int num:nums){
6+
set.add(num);
7+
}
8+
System.out.println(set);
9+
int answer = 0;
10+
for(int num:nums){
11+
//왼쪽으로 확장
12+
int left = 0;
13+
while(set.contains(num-(left+1))){
14+
left += 1;
15+
}
16+
17+
//오른쪽으로 확장
18+
int right = 0;
19+
while(set.contains(num+right+1)){
20+
right += 1;
21+
}
22+
System.out.println(String.valueOf(left)+" " + String.valueOf(right));
23+
answer = Math.max(answer,left+right+1);
24+
}
25+
26+
return answer;
27+
28+
}
29+
}

valid-anagram/Gotprgmer.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// 각 s와 t의 알파벳 수를 카운팅 시켜서 마지막에 카운팅이 모두 같으면 true
2+
// 그렇지 않으면 false;
3+
4+
// 시간복잡도 O(N) => 1중 for문
5+
// 공간복잡도 O(N) => N개 알파벳이 들어있는 Map 2개
6+
class SolutionGotprgmer {
7+
public boolean isAnagram(String s, String t) {
8+
Map<Character,Integer> sMap = new HashMap<>();
9+
Map<Character,Integer> tMap = new HashMap<>();
10+
if(s.length() != t.length()){
11+
return false;
12+
}
13+
for(int i=0;i<s.length();i++){
14+
char sChar = s.charAt(i);
15+
char tChar = t.charAt(i);
16+
sMap.put(sChar,sMap.getOrDefault(sChar,0)+1);
17+
tMap.put(tChar,tMap.getOrDefault(tChar,0)+1);
18+
}
19+
boolean flag = true;
20+
for(char c:sMap.keySet()){
21+
if(!sMap.getOrDefault(c,0).equals(tMap.getOrDefault(c,0))){
22+
flag = false;
23+
System.out.println(c);
24+
break;
25+
}
26+
}
27+
28+
return flag;
29+
}
30+
}

valid-anagram/higeuni.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// complexity
2+
// time: O(n log n)
3+
// - sort: O(n log n)
4+
// - split: O(n)
5+
// - join: O(n)
6+
// space: O(n)
7+
// - sortedS: O(n)
8+
// - sortedT: O(n)
9+
// - else : O(1)
10+
11+
var isAnagram = function(s, t) {
12+
return s.split('').sort().join('') === t.split('').sort().join('')
13+
};
14+

0 commit comments

Comments
 (0)