Skip to content

Commit 92a163f

Browse files
Merge pull request #163 from dev-jonghoonpark/main
[๋ฐ•์ข…ํ›ˆ] 10์ฃผ์ฐจ ๋‹ต์•ˆ ์ œ์ถœ
2 parents 42c41cd + e11a20f commit 92a163f

File tree

5 files changed

+379
-0
lines changed

5 files changed

+379
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
- ๋ฌธ์ œ
2+
- ์œ ๋ฃŒ: https://leetcode.com/problems/graph-valid-tree/
3+
- ๋ฌด๋ฃŒ: https://www.lintcode.com/problem/178/
4+
- ํ’€์ด: https://algorithm.jonghoonpark.com/2024/07/02/leetcode-261
5+
6+
## ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด
7+
8+
```java
9+
public class Solution {
10+
public boolean validTree(int n, int[][] edges) {
11+
int[] degrees = new int[n];
12+
13+
for (int[] edge : edges) {
14+
int largeOne = Math.max(edge[0], edge[1]);
15+
if (degrees[largeOne] == 0) {
16+
degrees[largeOne] += 1;
17+
} else {
18+
return false;
19+
}
20+
}
21+
22+
int zeroCount = 0;
23+
for (int degree : degrees) {
24+
if (degree == 0) {
25+
zeroCount++;
26+
}
27+
28+
if (zeroCount > 1) {
29+
return false;
30+
}
31+
}
32+
33+
return zeroCount == 1;
34+
}
35+
}
36+
```
37+
38+
๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •์„ ํ•˜๊ณ  ํ’€์—ˆ๋‹ค.
39+
40+
- ๋ฃจํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” 1๊ฐœ์˜ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„๋‹ค.
41+
- ๋ฃจํŠธ๋Š” ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.
42+
43+
๋”ฐ๋ผ์„œ ๊ฐ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ์ˆ˜๋ฅผ ์„ธ์–ด๋ดค์„ ๋•Œ ๋ฃจํŠธ์—๋Š” ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์ด ์—†์–ด์•ผ ํ•˜๋ฉฐ, ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋Š” 1๊ฐœ์˜ ๊ฐ„์„ ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
44+
45+
### TC, SC
46+
47+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค. ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์กฐ๊ธˆ ๋” ๋””ํ…Œ์ผ ํ•˜๊ฒŒ ๋ณด์ž๋ฉด ๊ฐ„์„  ์˜ ์ˆ˜๋„ ํฌํ•จ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
- ๋ฌธ์ œ: https://leetcode.com/problems/house-robber-ii/
2+
- ํ’€์ด: https://algorithm.jonghoonpark.com/2024/07/03/leetcode-213
3+
4+
## ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด
5+
6+
```java
7+
public class Solution {
8+
public int rob(int[] nums) {
9+
if (nums.length == 1) {
10+
return nums[0];
11+
}
12+
13+
if (nums.length == 2) {
14+
return Math.max(nums[0], nums[1]);
15+
}
16+
17+
if (nums.length == 3) {
18+
return Math.max(nums[2], Math.max(nums[0], nums[1]));
19+
}
20+
21+
22+
return Math.max(getMaxInRange(nums, 0, nums.length - 1), getMaxInRange(nums, 1, nums.length));
23+
}
24+
25+
public int getMaxInRange(int[] nums, int start, int end) {
26+
int[] dp = new int[nums.length];
27+
int max;
28+
dp[start] = nums[start];
29+
dp[start + 1] = nums[start + 1];
30+
dp[start + 2] = nums[start + 2] + nums[start];
31+
max = Math.max(dp[start + 2], dp[start + 1]);
32+
for (int i = start + 3; i < end; i++) {
33+
dp[i] = Math.max(nums[i] + dp[i - 2], nums[i] + dp[i - 3]);
34+
max = Math.max(max, dp[i]);
35+
}
36+
return max;
37+
}
38+
}
39+
```
40+
41+
### TC, SC
42+
43+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n), ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ด๋‹ค.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
- ๋ฌธ์ œ: https://leetcode.com/problems/house-robber/
2+
- ํ’€์ด: https://algorithm.jonghoonpark.com/2024/07/03/leetcode-198
3+
4+
## ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ’€์ด
5+
6+
```java
7+
public class Solution {
8+
public int rob(int[] nums) {
9+
int[] dp = new int[nums.length];
10+
int max = 0;
11+
12+
if (nums.length == 1) {
13+
return nums[0];
14+
}
15+
16+
if (nums.length == 2) {
17+
return Math.max(nums[0], nums[1]);
18+
}
19+
20+
if (nums.length == 3) {
21+
return Math.max(nums[2] + nums[0], nums[1]);
22+
}
23+
24+
dp[0] = nums[0];
25+
dp[1] = nums[1];
26+
dp[2] = nums[2] + nums[0];
27+
max = Math.max(dp[2], dp[1]);
28+
for (int i = 3; i < nums.length; i++) {
29+
dp[i] = Math.max(nums[i] + dp[i - 2], nums[i] + dp[i - 3]);
30+
max = Math.max(max, dp[i]);
31+
}
32+
return max;
33+
}
34+
}
35+
```
36+
37+
### TC, SC
38+
39+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n), ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ด๋‹ค.
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
- ๋ฌธ์ œ: https://leetcode.com/problems/longest-palindromic-substring/
2+
- ํ’€์ด: https://algorithm.jonghoonpark.com/2024/07/01/leetcode-5
3+
4+
## brute force ๋ฐฉ์‹ (beats 12.41%)
5+
6+
```java
7+
class Solution {
8+
public String longestPalindrome(String s) {
9+
int start = 0;
10+
int end = start;
11+
12+
String max = "";
13+
14+
char[] charArray = s.toCharArray();
15+
while (true) {
16+
if (end == s.length()) {
17+
break;
18+
}
19+
20+
if (charArray[start] == charArray[end]) {
21+
int tempStart = start;
22+
int tempEnd = end;
23+
24+
boolean isPalindrome = true;
25+
while (tempEnd >= tempStart) {
26+
if (charArray[tempStart] != charArray[tempEnd]) {
27+
isPalindrome = false;
28+
break;
29+
}
30+
if (tempStart == tempEnd) {
31+
break;
32+
}
33+
tempStart = tempStart + 1;
34+
tempEnd = tempEnd - 1;
35+
}
36+
37+
if (isPalindrome) {
38+
String temp = s.substring(start, end + 1);
39+
if (temp.length() > max.length()) {
40+
max = temp;
41+
}
42+
}
43+
}
44+
45+
end++;
46+
if (end == s.length()) {
47+
start = start + 1;
48+
end = start;
49+
}
50+
51+
if (start == s.length()) {
52+
break;
53+
}
54+
}
55+
56+
return max;
57+
}
58+
}
59+
```
60+
61+
### TC, SC
62+
63+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)์ด๊ณ , ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
64+
65+
## brute force ๋ฐฉ์‹ ๊ฐœ์„  (beats 48.52%)
66+
67+
์•„๋ž˜ ๋ถ€๋ถ„์ด ๋ถ€๋ถ„์ด๋‹ค.
68+
69+
```java
70+
start = start + 1;
71+
end = start + max.length();
72+
```
73+
74+
๋‹ค์Œ end ๊ฐ’์„ `start + max.length()` ๋กœ ๋‘์–ด ์—ฐ์‚ฐ์„ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ฝค ํฐ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.
75+
76+
```java
77+
class Solution {
78+
public String longestPalindrome(String s) {
79+
int start = 0;
80+
int end = start;
81+
82+
String max = "";
83+
84+
char[] charArray = s.toCharArray();
85+
while (start < s.length() && end < s.length()) {
86+
if (charArray[start] == charArray[end]) {
87+
int tempStart = start;
88+
int tempEnd = end;
89+
90+
boolean isPalindrome = true;
91+
while (tempEnd >= tempStart) {
92+
if (charArray[tempStart] != charArray[tempEnd]) {
93+
isPalindrome = false;
94+
break;
95+
}
96+
if (tempStart == tempEnd) {
97+
break;
98+
}
99+
tempStart = tempStart + 1;
100+
tempEnd = tempEnd - 1;
101+
}
102+
103+
if (isPalindrome) {
104+
String temp = s.substring(start, end + 1);
105+
if(temp.length() > max.length()) {
106+
max = temp;
107+
}
108+
end = end + 1;
109+
} else {
110+
if (s.indexOf(charArray[start], end) > -1) {
111+
end = end + 1;
112+
} else {
113+
start = start + 1;
114+
end = start + max.length();
115+
}
116+
}
117+
} else {
118+
end++;
119+
if (end == s.length()) {
120+
start = start + 1;
121+
end = start + max.length();
122+
}
123+
124+
if (start == s.length()) {
125+
break;
126+
}
127+
}
128+
129+
if (end == s.length()) {
130+
start = start + 1;
131+
end = start + max.length();
132+
}
133+
}
134+
135+
return max;
136+
}
137+
}
138+
```
139+
140+
### TC, SC
141+
142+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)์ด๊ณ , ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
143+
144+
๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• ์ƒ์œผ๋กœ๋Š” ๋™์ผํ•˜๋‚˜, ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋งค์šฐ ๋‹จ์ถ•๋˜์—ˆ๋‹ค.
145+
146+
## best solution (beats 95.84%)
147+
148+
ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ ๋ฌธ์ž๋ฅผ ์ค‘์‹ฌ์œผ๋กœ Palindrome ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ผ€์ด์Šค๋ฅผ ์กฐ์‚ฌํ•œ๋‹ค.
149+
150+
```java
151+
class Solution {
152+
public String longestPalindrome(String s) {
153+
String max = "";
154+
155+
char[] charArray = s.toCharArray();
156+
for (int i = 0; i < s.length(); i++) {
157+
char currentChar = charArray[i];
158+
int left = i;
159+
int right = i;
160+
161+
while (right < s.length() - 1 && currentChar == charArray[right + 1]) {
162+
right++;
163+
}
164+
165+
while (left > 0 && right < s.length() - 1 && charArray[left - 1] == charArray[right + 1]) {
166+
left--;
167+
right++;
168+
}
169+
170+
String temp = s.substring(left, right + 1);
171+
if (temp.length() > max.length()) {
172+
max = temp;
173+
}
174+
}
175+
176+
return max;
177+
}
178+
}
179+
```
180+
181+
### TC, SC
182+
183+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(n)์ด๋‹ค. palindrome ์˜ ๊ธธ์ด๊ฐ€ n ์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2) ์— ๊ฐ€๊นŒ์›Œ ์ง„๋‹ค.
184+
๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
185+
186+
๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• ์ƒ์œผ๋กœ๋„ ๊ฐœ์„ ์ด ๋œ ๋ฐฉ์‹์ด๋‹ค. ์‹ค์ œ๋กœ ์‹œ๊ฐ„๋„ ๋” ๋‹จ์ถ•๋˜์—ˆ๋‹ค.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
- ๋ฌธ์ œ
2+
- ์œ ๋ฃŒ: https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
3+
- ๋ฌด๋ฃŒ: https://neetcode.io/problems/count-connected-components
4+
- ํ’€์ด: https://algorithm.jonghoonpark.com/2024/07/03/leetcode-323
5+
6+
```java
7+
public class Solution {
8+
public int countComponents(int n, int[][] edges) {
9+
Map<Integer, Vertex> vertexMap = new HashMap<>();
10+
int lastGroupId = 0;
11+
12+
for (int[] edge : edges) {
13+
Vertex v1 = vertexMap.getOrDefault(edge[0], new Vertex(edge[0]));
14+
Vertex v2 = vertexMap.getOrDefault(edge[1], new Vertex(edge[1]));
15+
16+
v1.edges.add(v2);
17+
v2.edges.add(v1);
18+
19+
vertexMap.put(edge[0], v1);
20+
vertexMap.put(edge[1], v2);
21+
}
22+
23+
for (int i = 0; i < n; i++) {
24+
Vertex vertex = vertexMap.get(i);
25+
if (vertex == null) {
26+
lastGroupId++;
27+
} else {
28+
// 0 ์ด ์•„๋‹ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ํƒ์ƒ‰ํ•œ ์ผ€์ด์Šค๋ฏ€๋กœ ์Šคํ‚ต
29+
if (vertex.groupId == 0) {
30+
lastGroupId++;
31+
dfs(vertex, lastGroupId);
32+
}
33+
}
34+
}
35+
36+
return lastGroupId;
37+
}
38+
39+
public void dfs(Vertex vertex, int groupId) {
40+
vertex.groupId = groupId;
41+
for (Vertex connected : vertex.edges) {
42+
if (connected.groupId == 0) {
43+
dfs(connected, groupId);
44+
}
45+
}
46+
}
47+
}
48+
49+
class Vertex {
50+
int id;
51+
int groupId;
52+
List<Vertex> edges;
53+
54+
public Vertex(int id) {
55+
this.id = id;
56+
this.edges = new ArrayList<>();
57+
}
58+
}
59+
```
60+
61+
### TC, SC
62+
63+
Vertex ์˜ ์ˆ˜๋ฅผ V, Edge ์˜ ์ˆ˜๋ฅผ E ๋ผ๊ณ  ํ•˜์˜€์„ ๋•Œ,
64+
์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V + E), ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(V + E) ์ด๋‹ค.

0 commit comments

Comments
ย (0)