Skip to content

Commit 2b45341

Browse files
authored
Merge pull request #2045 from rivkode/main
[rivkode] WEEK 02 solutions
2 parents 9ccd6eb + 826bf36 commit 2b45341

File tree

3 files changed

+267
-0
lines changed

3 files changed

+267
-0
lines changed

3sum/rivkode.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
1. 문제분석
3+
3개의 수를 더해서 0을 만들자
4+
5+
2. 예외 케이스
6+
7+
3. 알고리즘
8+
2포인터 활용
9+
10+
4. 구현
11+
12+
[-4, -1, -1, 0, 1, 2]
13+
14+
배열을 정렬하고 2개의 포인터를 잡은 뒤 더한 값의 -한 값이 배열 내에 존재하는지 체크
15+
배열의 i 값과 2개 포인터를 모두 더한 값이 음수라면 left를 우측으로 이동
16+
배열의 i 값과 2개 포인터를 모두 더한 값이 양수라면 right를 좌측으로 이동
17+
*/
18+
19+
import java.util.*;
20+
21+
class Solution {
22+
public List<List<Integer>> threeSum(int[] nums) {
23+
Arrays.sort(nums);
24+
Set<List<Integer>> set = new HashSet<>();
25+
26+
for (int i=0; i<nums.length; i++) {
27+
// target 변수 세팅
28+
int target = nums[i];
29+
int left = i+1;
30+
int right = nums.length - 1;
31+
32+
// left, right 포인터 서로 이동
33+
while (left < right) {
34+
int leftInt = nums[left];
35+
int rightInt = nums[right];
36+
37+
if ((target + leftInt + rightInt) == 0) {
38+
List<Integer> temp = new ArrayList<>();
39+
temp.add(target);
40+
temp.add(leftInt);
41+
temp.add(rightInt);
42+
43+
set.add(temp);
44+
45+
// 일치할 경우 해당 선택된 인덱스에 대해 추가로 확인하기 위해서 left, right 값 변경
46+
left += 1;
47+
right -= 1;
48+
} else if ((target + leftInt + rightInt) < 0) {
49+
left += 1;
50+
} else if ((target + leftInt + rightInt) > 0) {
51+
right -= 1;
52+
}
53+
}
54+
}
55+
56+
return set.stream().collect(Collectors.toList());
57+
}
58+
}
59+

climbing-stairs/rivkode.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
이것도 dp 아닌가 ?
3+
이전의 계산들을 다음 계산에 사용할 수 있음
4+
메모이제이션과 dp를 사용하면 풀 수 있을 것 같은데
5+
dp 아니네
6+
7+
만약 5를 만드려면
8+
3을 만드는 경우의 수와 2를 만드는 경우의 수를 곱하면 되는것 아닌가 ?
9+
10+
3을 만드려면 ?
11+
2를 만들 수 있는 경우의 수에 1을 만들 수 있는 경우의 수를 더해주면 되는거 아닌가 ?
12+
순서를 바꾸고 ?
13+
14+
111
15+
21
16+
12
17+
18+
1111
19+
211
20+
121
21+
112
22+
22
23+
24+
11111
25+
2111
26+
1211
27+
1121
28+
1112
29+
221
30+
212
31+
122
32+
33+
111111
34+
21111
35+
12111
36+
11211
37+
11121
38+
11112
39+
1122
40+
1212
41+
1221
42+
2211
43+
2121
44+
2112
45+
222
46+
47+
48+
49+
50+
1 - 1
51+
2 - 2
52+
3 - 3
53+
4 - 5
54+
5 - 8
55+
6 - 13
56+
57+
count(3) = coun(1) + count(2)
58+
count(4) = count(3) + count(2)
59+
60+
점화식
61+
62+
count(n) = count(n-1) + count(n-2)
63+
64+
*/
65+
66+
class Solution {
67+
public int climbStairs(int n) {
68+
// n은 45까지 있으므로 배열을 45까지 구하면 됨
69+
70+
int[] arr = new int[45];
71+
arr[0] = 1;
72+
arr[1] = 2;
73+
74+
for (int i=2; i<45; i++) {
75+
arr[i] = arr[i-1] + arr[i-2];
76+
}
77+
78+
return arr[n-1];
79+
}
80+
}
81+
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
17+
/*
18+
1. 문제 이해
19+
20+
트리가 주어졌을 때 해당 트리가 BST인지 판별
21+
BST인제 판별하는 방법은 key 기준 left는 작아야 하고 right는 커야 한다.
22+
이 조건이 실패하면 해당 트리는 BST가 아니다.
23+
24+
2. 예외 케이스
25+
26+
노드 개수의 범위는
27+
tree node가 1개부터 최고 1만개 까지
28+
29+
1개일 경우
30+
바로 반환
31+
32+
그 외는 계산 진행
33+
34+
35+
3. 알고리즘 선택
36+
37+
dfs 선택
38+
a. 노드 key 기준으로 계속 파고들어서 반복할 수 있을 것 같아서
39+
b. left, right가 있는지를 기준으로 있다면 다시 dfs가 가능해서
40+
41+
bfs로 해도 key를 알고 있으니까 되긴 할 것 같은데 일단 dfs로 해보자
42+
43+
아니다 bfs로 해야할 것 같은데 ? 이게 깊게 들어가는게 중요한게 아니라 전체 탐색을 해야하니 순차적으로 key들을 탐색하면서 작은지 큰지를 판별하면 될 것 같다.
44+
45+
bfs로 진행해보자
46+
47+
아니다 .. dfs가 맞네 하한 상한을 정해줘야 함
48+
그리고 예외 케이스 있다 [-2147483648,null,2147483647]
49+
50+
처음에 하한과 상한을 MIN_VALUE, MAX_VALUE를 통해 사용하고 있었는데 위 엣지 케이스를 발견
51+
52+
처음에는 Integer.MIN_VALUE 와 같이 Integer을 사용해서 위 예외 케이스를 만났는데
53+
이걸 15분 동안 고민하다 gemini 한테 물어보니까 그냥 Long 쓰면 된단다 ...
54+
Long으로 변경하니 통과 ..
55+
56+
만약 조건범위가 Long 의 범위였다면 ,,? 어떻게 해결해야했을까.
57+
4. 구현
58+
59+
*/
60+
61+
import java.util.*;
62+
63+
class Solution {
64+
public boolean isValidBST(TreeNode root) {
65+
Long min = Long.MIN_VALUE;
66+
Long max = Long.MAX_VALUE;
67+
68+
if (root.left == null && root.right == null) {
69+
return true;
70+
}
71+
72+
return dfs(root, min, max);
73+
74+
}
75+
76+
public boolean dfs(TreeNode node, long min, long max) {
77+
if (node == null) {
78+
return true;
79+
}
80+
81+
// 정상 범위
82+
if (min < node.val && node.val < max) {
83+
return dfs(node.left, min, node.val) && dfs(node.right, node.val, max);
84+
} else {
85+
return false;
86+
}
87+
}
88+
89+
// 아래와 같이 풀려고 했으나 하한값과 상한값에 대한 인자를 넘겨줘야 하는데 넘겨줄 수 없어서 dfs로 풀어야 함
90+
// 에러 케이스
91+
// [5,4,6,null,null,3,7]
92+
// private static int preKey;
93+
// public boolean isValidBST(TreeNode root) {
94+
// Queue<TreeNode> queue = new LinkedList<>();
95+
96+
// queue.offer(root);
97+
// preKey = root.val;
98+
99+
// while (!queue.isEmpty()) {
100+
// TreeNode node = queue.poll();
101+
// int key = node.val;
102+
// TreeNode left = node.left;
103+
// TreeNode right = node.right;
104+
105+
// // left 처리
106+
// if (left != null) {
107+
// queue.offer(left);
108+
// if (left.val >= key) {
109+
// return false;
110+
// }
111+
112+
// if ()
113+
// }
114+
115+
// // right 처리
116+
// if (right != null) {
117+
// queue.offer(right);
118+
// if (right.val <= key) {
119+
// return false;
120+
// }
121+
// }
122+
// }
123+
124+
// return true;
125+
// }
126+
}
127+

0 commit comments

Comments
 (0)