Skip to content

Commit 8aa48c4

Browse files
authored
Merge pull request DaleStudy#706 from eunhwa99/main
[eunhwa99] Week 02 Solutions
2 parents 2007a35 + b09bf5b commit 8aa48c4

File tree

5 files changed

+239
-0
lines changed

5 files changed

+239
-0
lines changed

โ€Ž3sum/eunhwa99.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.List;
4+
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--;
44+
} 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--;
61+
}
62+
}
63+
}
64+
65+
return answer;
66+
}
67+
}
68+
69+

โ€Žclimbing-stairs/eunhwa99.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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)
9+
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];
22+
}
23+
return cntArray[n];
24+
}
25+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธ -> O(n)
2+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: ์žฌ๊ท€์ ์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑ ->
3+
// ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜• ์žกํžŒ ๊ฒฝ์šฐ(์ฆ‰, ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ log(n)์ธ ๊ฒฝ์šฐ), ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์˜ ๊นŠ์ด๋Š” O(log n)
4+
// ํŠธ๋ฆฌ๊ฐ€ ํŽธํ–ฅ๋œ ํ˜•ํƒœ(์˜ˆ: ๋ชจ๋‘ ์™ผ์ชฝ ์ž์‹๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ)๋ผ๋ฉด, ์žฌ๊ท€ ๊นŠ์ด๋Š” O(n)
5+
6+
class TreeNode {
7+
int val;
8+
TreeNode left;
9+
TreeNode right;
10+
11+
TreeNode() {}
12+
13+
TreeNode(int val) {
14+
this.val = val;
15+
}
16+
17+
TreeNode(int val, TreeNode left, TreeNode right) {
18+
this.val = val;
19+
this.left = left;
20+
this.right = right;
21+
}
22+
}
23+
24+
class Solution {
25+
26+
int preIdx = 0;
27+
28+
public TreeNode buildTree(int[] preorder, int[] inorder) {
29+
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0) {
30+
return null;
31+
}
32+
33+
return build(preorder, inorder, 0, inorder.length - 1);
34+
}
35+
36+
37+
private TreeNode build(int[] preorder, int[] inorder, int inStart, int inEnd) {
38+
// ์žฌ๊ท€ ์ข…๋ฃŒ ์กฐ๊ฑด
39+
// ํฌ์ธํ„ฐ(์ธ๋ฑ์Šค)๊ฐ€ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ๋„˜์—ˆ์„
40+
if (preIdx >= preorder.length || inStart > inEnd) {
41+
return null;
42+
}
43+
44+
// preorder ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ ํ•ด๋‹น ๋ถ€๋ถ„ ํŠธ๋ฆฌ์˜ root ์ด๋‹ค.
45+
int rootVal = preorder[preIdx++];
46+
TreeNode root = new TreeNode(rootVal);
47+
48+
// inOrder ๋ฐฐ์—ด์—์„œ root ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.
49+
int rootIndex = -1;
50+
for (int i = inStart; i <= inEnd; i++) {
51+
if (inorder[i] == rootVal) {
52+
rootIndex = i;
53+
break;
54+
}
55+
}
56+
57+
// root ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ inorder ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด(inStart ~ rootIndex-1)์€ root์˜ left tree,
58+
// ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด(rootIndex+1 ~ inEnd)์€ root์˜ right tree ๊ฐ€ ๋œ๋‹ค.
59+
root.left = build(preorder, inorder, inStart, rootIndex - 1);
60+
root.right = build(preorder, inorder, rootIndex + 1, inEnd);
61+
62+
return root;
63+
}
64+
}

โ€Ždecode-ways/eunhwa99.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.util.Arrays;
2+
3+
/**
4+
* ๋ฌธ์ œ ํ’€์ด
5+
* ์˜ˆ์ œ) 11106
6+
* ๊ฐ€์žฅ ํฐ ์ˆ˜๋Š” 2์ž๋ฆฌ ์ด๋ฏ€๋กœ ํ•œ ๋ฒˆ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์นธ์€ 1~2์นธ
7+
* ํ˜„์žฌ ์นธ์ด 0์ผ ๊ฒฝ์šฐ๋Š” ์นธ ์ด๋™ ๋ถˆ๊ฐ€
8+
* ์ฝ”๋“œ ๋ฒ”์œ„๋Š” 1~26
9+
*/
10+
11+
//์‹œ๊ฐ„ ๋ณต์žก๋„: ๋ฌธ์ž์—ด์˜ ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ „์ฒด O(n)
12+
//๊ณต๊ฐ„ ๋ณต์žก๋„: dp ๋ฐฐ์—ด์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์— ๋น„๋ก€ํ•˜์—ฌ O(n) ๊ณต๊ฐ„์„ ์ฐจ์ง€
13+
14+
class Solution {
15+
16+
int stringSize = 0;
17+
int[] dp;
18+
19+
// DP ์ด์šฉ
20+
public int numDecodings(String s) {
21+
stringSize = s.length();
22+
dp = new int[stringSize + 1];
23+
Arrays.fill(dp, -1);
24+
return numDecodingHelper(s.toCharArray(), 0);
25+
}
26+
27+
// dp -> O(N)
28+
private int numDecodingHelper(char[] s, int curIndex) {
29+
if (stringSize == curIndex) return 1;
30+
if (s[curIndex] == '0') return 0; // ํ˜„์žฌ ์นธ์ด 0 -> ์ „์ง„ ๋ถˆ๊ฐ€
31+
if (dp[curIndex] != -1) return dp[curIndex];
32+
33+
dp[curIndex] = 0; // ํ˜„์žฌ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒดํฌ
34+
dp[curIndex] += numDecodingHelper(s, curIndex + 1); // ํ•œ ์นธ ์ „์ง„
35+
36+
if ((curIndex + 1 < stringSize) && checkRange(s[curIndex], s[curIndex + 1])) // 2์ž๋ฆฌ ์ฝ”๋“œ๊ฐ€ 10~26 ์•ˆ์— ๋“ค์–ด๊ฐ„๋‹ค๋ฉด
37+
dp[curIndex] += numDecodingHelper(s, curIndex + 2); // 2์นธ ์ „์ง„
38+
39+
return dp[curIndex];
40+
}
41+
42+
private boolean checkRange(char left, char right) {
43+
int leftNum = left - '0';
44+
int rightNum = right - '0'; // ์ˆซ์ž๋กœ ๋ณ€ํ™˜
45+
46+
int num = leftNum * 10 + rightNum;
47+
return (num >= 10 && num <= 26);
48+
}
49+
}

โ€Žvalid-anagram/eunhwa99.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
/**
5+
* ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„
6+
*/
7+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธ -> O(n)
8+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๊ณต๊ฐ„ ํ•„์š”(hashmap ํฌ๊ธฐ) -> O(n)
9+
class Solution {
10+
public boolean isAnagram(String s, String t) {
11+
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);
19+
}
20+
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);
27+
}
28+
29+
// ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ•ด์‹œ๋งต์ด ๋น„์–ด ์žˆ์–ด์•ผ ํ•จ
30+
return sAlphabetCountMap.isEmpty();
31+
}
32+
}

0 commit comments

Comments
ย (0)