Skip to content

Commit 7685be4

Browse files
authored
Merge pull request #1229 from eunhwa99/main
[eunhwa99] Week 02 Solutions
2 parents 5f31403 + ccb08c9 commit 7685be4

File tree

5 files changed

+102
-131
lines changed

5 files changed

+102
-131
lines changed

โ€Ž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-

โ€Žclimbing-stairs/eunhwa99.java

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
1-
/**
2-
* ๋ฌธ์ œ ํ’€์ด
3-
*/
4-
// n=2 (1,1), (2) -> 2 ๊ฐ€์ง€
5-
// n=3 (n=2, 1), (n=1, 2) -> 2 + 1 = 3๊ฐ€์ง€
6-
// n=4 (n=3, 1), (n=2, 2) -> 3 + 2 = 5๊ฐ€์ง€
7-
// n=5 (n=4, 1) , (n=3, 2)
8-
// n=k (n=k-1, 1), (n=k-2, 2)
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n) - n์€ ๊ณ„๋‹จ์˜ ๊ฐœ์ˆ˜
2+
// ๊ณต๊ฐ„ ๋ณต์žก๋„ O(1) - ์ƒ์ˆ˜ ๊ณต๊ฐ„ ์‚ฌ์šฉ
3+
class Solution{
4+
public int climbStairs(int n){
5+
// ํ”ผ๋ณด๋‚˜์น˜
6+
int prev1 = 1; // 0๋ฒˆ์งธ ๊ณ„๋‹จ
7+
int prev2 = 1; // 1๋ฒˆ์งธ ๊ณ„๋‹จ
98

10-
/**
11-
* ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„
12-
*/
13-
// ์‹œ๊ฐ„ ๋ณต์žก๋„: ๊ฐ ์นธ์„ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ -> O(n)
14-
// ๊ณต๊ฐ„ ๋ณต์žก๋„: DP ๋ฐฐ์—ด ํฌ๊ธฐ -> O(n)
15-
class Solution {
16-
public int climbStairs(int n) {
17-
int[] cntArray = new int[n + 1];
18-
cntArray[0] = 1;
19-
cntArray[1] = 1;
20-
for (int i = 2; i <= n; ++i) {
21-
cntArray[i] = cntArray[i - 1] + cntArray[i - 2];
9+
for(int i=2; i<=n; i++){
10+
int current = prev1 + prev2;
11+
prev1 = prev2;
12+
prev2 = current;
2213
}
23-
return cntArray[n];
14+
return prev2;
2415
}
2516
}
Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,33 @@
1-
// ํ’€์ด
2-
// ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ i ์ผ ๋•Œ, ๋ฌธ์ œ์—์„œ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
3-
// ๋‚˜์˜ ์™ผ์ชฝ(i-1)๋ถ€ํ„ฐ ์ฒ˜์Œ๊นŒ์ง€์˜ ๊ณฑ * ๋‚˜์˜ ์˜ค๋ฅธ์ชฝ(i+1)๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๊ณฑ
4-
// leftProduct[i-1] = ์™ผ์ชฝ(i-1)๋ถ€ํ„ฐ ์ฒ˜์Œ๊นŒ์ง€์˜ ๊ณฑ
5-
// rightProduct[i+1] = ์˜ค๋ฅธ์ชฝ(i+1)๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๊ณฑ
6-
// leftProduct๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ i๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. leftProduct[i] = leftProduct[i-1] * (๋‚˜ ์ž์‹  = nums[i])
7-
// rightProduct๋Š” ๋๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ i๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. rightProduct[i] = rightProduct[i+1] * (๋‚˜ ์ž์‹  = nums[i])
8-
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - nums ๋ฐฐ์—ด์˜ ๊ธธ์ด n
2+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n) - leftProduct์™€ rightProduct ๋ฐฐ์—ด์„ ์‚ฌ์šฉ
3+
class Solution {
94

10-
// DP ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)
11-
// ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” 2๊ฐœ์˜ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๊ณ , ๋‹ต์œผ๋กœ ๋ณด๋‚ผ ๋ฐฐ์—ด๊นŒ์ง€ ํ•ด์„œ O(3*N) = O(N)
5+
public int[] productExceptSelf(int[] nums) {
6+
int[] leftProduct = new int[nums.length];
7+
int[] rightProduct = new int[nums.length];
128

13-
class Solution {
14-
public int[] productExceptSelf(int[] nums) {
15-
int len = nums.length;
16-
int[] leftProduct = new int[len];
17-
int[] rightProduct = new int[len];
9+
for (int i = 0; i < nums.length; i++) {
10+
if (i == 0) {
11+
leftProduct[i] = 1;
12+
} else {
13+
leftProduct[i] = leftProduct[i - 1] * nums[i - 1];
14+
}
15+
}
1816

19-
leftProduct[0] = nums[0];
20-
rightProduct[len - 1] = nums[len - 1];
21-
for (int i = 1; i < len; ++i) {
22-
leftProduct[i] = leftProduct[i - 1] * nums[i];
23-
rightProduct[len - i - 1] = rightProduct[len - i] * nums[len - i - 1];
24-
}
17+
for (int i = nums.length - 1; i >= 0; i--) {
18+
if (i == nums.length - 1) {
19+
rightProduct[i] = 1;
20+
} else {
21+
rightProduct[i] = rightProduct[i + 1] * nums[i + 1];
22+
}
23+
}
2524

26-
int[] result = new int[len];
27-
result[0] = rightProduct[1];
28-
result[len - 1] = leftProduct[len - 2];
29-
for (int i = 1; i < len - 1; ++i) {
30-
result[i] = leftProduct[i - 1] * rightProduct[i + 1];
31-
}
32-
return result;
25+
int[] result = new int[nums.length];
26+
for (int i = 0; i < nums.length; i++) {
27+
result[i] = leftProduct[i] * rightProduct[i];
3328
}
29+
return result;
30+
}
3431
}
3532

33+

โ€Žvalid-anagram/eunhwa99.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,21 @@
1-
import java.util.HashMap;
2-
import java.util.Map;
3-
4-
/**
5-
* ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„
6-
*/
7-
// ์‹œ๊ฐ„ ๋ณต์žก๋„: ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธ -> O(n)
8-
// ๊ณต๊ฐ„ ๋ณต์žก๋„: ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๊ณต๊ฐ„ ํ•„์š”(hashmap ํฌ๊ธฐ) -> O(n)
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - ๋ฌธ์ž์—ด ๊ธธ์ด n
2+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) - ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜๋Š” 26๊ฐœ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์Œ
93
class Solution {
104
public boolean isAnagram(String s, String t) {
5+
if(s.length()!=t.length()) return false; // ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅด๋ฉด false
116

12-
// s ์•ˆ์˜ ๋ฌธ์ž๋“ค์ด t ์—๋„ ๋™์ผํ•œ ํšŸ์ˆ˜๋กœ ๋“ฑ์žฅํ•˜๋Š” ์ง€ ํ™•์ธ
13-
if (s.length() != t.length()) return false; // ๋‘ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ์•„๋‚˜๊ทธ๋žจ์ด ์•„๋‹ˆ๋‹ค.
14-
15-
// ๋ฌธ์ž๋ณ„ ํšŸ์ˆ˜ ์ €์žฅ map
16-
Map<Character, Integer> sAlphabetCountMap = new HashMap<>();
17-
for (char c : s.toCharArray()) { // ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
18-
sAlphabetCountMap.put(c, sAlphabetCountMap.getOrDefault(c, 0) + 1);
7+
int[] letterCount = new int[26];
8+
// ๊ฐ ์•ŒํŒŒ๋ฒณ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
9+
for(int i = 0; i < s.length(); i++){
10+
letterCount[s.charAt(i) - 'a']++;
11+
letterCount[t.charAt(i) - 'a']--;
1912
}
2013

21-
for (char c : t.toCharArray()) { // ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
22-
if (!sAlphabetCountMap.containsKey(c)) return false; // s์— t๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์ด ์—†๋‹ค๋ฉด ์•„๋‚˜๊ทธ๋žจ์ด ์•„๋‹ˆ๋‹ค.
23-
24-
int count = sAlphabetCountMap.get(c) - 1;
25-
if (count == 0) sAlphabetCountMap.remove(c);
26-
else sAlphabetCountMap.put(c, count);
14+
for(int count : letterCount){
15+
if(count != 0) return false;
2716
}
17+
return true;
2818

29-
// ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ•ด์‹œ๋งต์ด ๋น„์–ด ์žˆ์–ด์•ผ ํ•จ
30-
return sAlphabetCountMap.isEmpty();
3119
}
3220
}
21+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n) - n์€ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜
2+
// ๊ณต๊ฐ„ ๋ณต์žก๋„ O(h) - h๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด (์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ๊ณต๊ฐ„)
3+
public class TreeNode{
4+
int val;
5+
TreeNode left;
6+
TreeNode right;
7+
8+
TreeNode(int x) {
9+
val = x;
10+
}
11+
}
12+
class Solution{
13+
public boolean isValidBST(TreeNode root) {
14+
return isValidBSTHelper(root, Long.MIN_VALUE, Long.MAX_VALUE);
15+
}
16+
private boolean isValidBSTHelper(TreeNode node, long min, long max) {
17+
if (node == null) {
18+
return true;
19+
}
20+
if (node.val <= min || node.val >= max) {
21+
return false;
22+
}
23+
return isValidBSTHelper(node.left, min, node.val) && isValidBSTHelper(node.right, node.val, max);
24+
}
25+
}
26+
27+

0 commit comments

Comments
ย (0)