Skip to content

Commit f8a2b19

Browse files
authored
Merge pull request #738 from GotPrgmer/main
[Gotprgmer] Week 2
2 parents eaf71df + 0dc929f commit f8a2b19

File tree

5 files changed

+150
-0
lines changed

5 files changed

+150
-0
lines changed

3sum/Gotprgmer.java

+37
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+
}

climbing-stairs/Gotprgmer.java

+16
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+
}

house-robber/Gotprgmer.java

+38
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+
}
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

+30
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+
}

0 commit comments

Comments
 (0)