Skip to content

Commit 4f6ac69

Browse files
authored
Merge pull request #1815 from jinvicky/main
[jinvicky] WEEK 04 Solutions
2 parents 1a1a120 + 2b1cf5a commit 4f6ac69

File tree

5 files changed

+183
-0
lines changed

5 files changed

+183
-0
lines changed

โ€Žcoin-change/jinvicky.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
public int coinChange(int[] coins, int amount) {
5+
int max=amount+1;
6+
int [] dp=new int[amount+1];
7+
Arrays.fill(dp,max);
8+
dp[0]=0;
9+
for(int coin:coins){
10+
for(int j=coin;j<=amount;j++){ // coin๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ผ๋ฐ˜ ๋ฃจํ”„๋ณด๋‹ค ์„ฑ๋Šฅ ํ–ฅ์ƒ
11+
dp[j]=Math.min(dp[j],dp[j-coin]+1);
12+
}
13+
}
14+
return dp[amount]>amount ? -1:dp[amount];
15+
}
16+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
class Solution {
3+
public int findMin(int[] nums) {
4+
int left = 0;
5+
int right = nums.length - 1;
6+
7+
// 0๋ฒˆ์งธ๊ฐ’์ด length-1๋ฒˆ์žฌ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด rotate๋˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
8+
// 2,3,4,5,1 0๋ฒˆ์งธ > length-1๋ฒˆ์งธ
9+
// 3,4,5,1,2 0๋ฒˆ์งธ > length-1๋ฒˆ์งธ
10+
// 1,2,3,4,5 0๋ฒˆ์งธ < length-1๋ฒˆ์งธ
11+
if (nums[right] >= nums[left]) return nums[0];
12+
13+
while (left < right) {
14+
// ๋‹จ์ˆœํžˆ (left+right)/2 ๋ณด๋‹ค ๋ฒ”์œ„ ๊ณ„์‚ฐ ์˜ค์ฐจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
15+
int mid = left + (right - left) / 2;
16+
17+
// ์ค‘๊ฐ„๊ฐ’์ด ์˜ค๋ฅธ์ชฝ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์ค‘๊ฐ„๊ฐ’+1๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
18+
if (nums[mid] > nums[right]) { // <= ์™€ ๋™์ผ
19+
left = mid + 1;
20+
} else {
21+
// ์ค‘๊ฐ„๊ฐ’๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ๊ฐ’์ด ํฌ๋‹ค๋ฉด ์ค‘๊ฐ„๊ฐ’์ด ์ตœ๋Œ€ ๋ฒ”์œ„๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
22+
// ์ตœ์†Œ๊ฐ’์ด mid์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
23+
right = mid;
24+
}
25+
}
26+
return nums[left];
27+
}
28+
}
29+
30+
// ์ฒ˜์Œ์—๋Š” ์ „ํ˜• ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ์„œ left = mid+1, right = mid-1์„ ํ–ˆ์œผ๋‚˜ ์‹คํŒจ
31+
// ํ•˜์ง€๋งŒ ์ตœ์†Œ ์ˆซ์ž๋Š” ๋ฌด์กฐ๊ฑด left๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ž„.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ๋‹ค์Œ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ํƒ์ƒ‰์„ ์‹œ์ž‘
2+
// 1 (root)
3+
// / \
4+
// 2 3
5+
// / \ / \
6+
// 4 5 6 7
7+
//
8+
// root๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋…ธ๋“œ๋ณ„๋กœ left, right์„ ๋˜ ์žฌ๊ท€๋กœ ํ˜ธ์ถœํ•˜๋‹ˆ
9+
// (1)์˜ left, right, (2)์˜ left, right, (3)์˜ left, right, (4)์˜ left, right์ด ์‹คํ–‰๋œ๋‹ค.
10+
// ๊ฒฐ๊ณผ์ ์œผ๋กœ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ depth์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ depth + ์ตœ์ดˆ root์˜ depth 1์„ ํ•ฉํ•ด์„œ ์™„์„ฑ
11+
// Math.max()๋Š” ํ•จ์ˆ˜ ์•ˆ์˜ ๋ชจ๋“  ๊ฐ’์ด ๊ณ„์‚ฐ๋˜์–ด์•ผ๋งŒ ์‹คํ–‰๋œ๋‹ค.
12+
class Solution {
13+
// ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ BFS๋ณด๋‹ค DFS๊ฐ€ ๋” ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
14+
// ๋งค ๋…ธ๋“œ์˜ left, right์„ ์žฌ๊ท€๋กœ ํ˜ธ์ถœํ•ด์„œ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€ ํ•จ์ˆ˜ ํ•„์š”.
15+
public int maxDepth(TreeNode root) {
16+
// ์žฌ๊ท€ ์ข…๋ฃŒ ์กฐ๊ฑด == left ํ˜น์€ right๊ฐ€ null์ผ ๋•Œ, root ์ž์ฒด๊ฐ€ ๋„์ด๋ผ๋ฉด?
17+
if (root == null) return 0;
18+
19+
// ๋ˆ„์ ์„ ์œ„ํ•ด์„œ 1+๋ฅผ ํ•˜๊ณ , Math.max()๋กœ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
20+
return 1+ Math.max(maxDepth(root.left), maxDepth(root.right));
21+
}
22+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
3+
ListNode answer = new ListNode();
4+
ListNode mergePointer = answer;
5+
// ๋จธ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•  ํฌ์ธํ„ฐ์™€ ์ •๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ํฌ์ธํ„ฐ ์ด 2๊ฐœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
6+
// ์ดˆ๊ธฐํ™”์—์„œ ์ •๋‹ต ํฌ์ธํ„ฐ์™€ ๋จธ์ง€ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
7+
// ๋จธ์ง€ ํฌ์ธํ„ฐ๊ฐ€ ์—ฐ์‚ฐ์„ ๊ณ„์†ํ•˜๋”๋ผ๋„ ์ •๋‹ต ํฌ์ธํ„ฐ์˜ next๋Š” ์ •๋ ฌ๋œ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
8+
// ๋จธ์ง€ ํฌ์ธํ„ฐ๋Š” ์—ฐ์‚ฐ์„ ๊ณ„์†ํ•˜๋ฉด์„œ ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ž์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
9+
10+
while (list1 != null && list2 != null) {
11+
// list1์˜ ๊ฐ’์ด list2์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด list1์˜ ๋…ธ๋“œ๋ฅผ ๋ณ‘ํ•ฉ
12+
if (list1.val <= list2.val) { // wrong: ๊ฐ’์ด ๋” ์ž‘๊ฑฐ๋‚˜, ๋˜๋Š” ๊ฐ’์ด ๋™์ผํ•  ๊ฒฝ์šฐ list1์„ ์šฐ์„ ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
13+
mergePointer.next = list1;
14+
list1 = list1.next;
15+
} else {
16+
// ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด list2์˜ ๋…ธ๋“œ๋ฅผ ๋ณ‘ํ•ฉ
17+
mergePointer.next = list2;
18+
list2 = list2.next;
19+
}
20+
mergePointer = mergePointer.next;
21+
}
22+
23+
// ๋‘ ๋ฆฌ์ŠคํŠธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ์ „์ œ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ๊ทธ์ € ํ†ต ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
24+
// ๋‘ ๋ฆฌ์ŠคํŠธ ์ค‘์—์„œ null์ด ์•„๋‹Œ ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ๋กœ ๋จธ์ง€ ํฌ์ธํ„ฐ์˜ next์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
25+
if (list1 != null) {
26+
mergePointer.next = list1;
27+
} else {
28+
mergePointer.next = list2;
29+
}
30+
return answer.next;
31+
}
32+
}

โ€Žword-search/jinvicky.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
class Solution {
2+
public boolean exist(char[][] board, String word) {
3+
int m = board.length;
4+
int n = board[0].length;
5+
for(int i = 0; i < m; i++) {
6+
for(int j = 0; j < n; j++) {
7+
if(dfs(board, i, j, word, 0)) {
8+
return true;
9+
}
10+
}
11+
}
12+
return false;
13+
}
14+
15+
boolean dfs(char[][] board,int i,int j,String word,int index){
16+
if(index == word.length()) return true;
17+
if(i<0 || j<0 || i>=board.length || j>=board[0].length) return false; // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ
18+
if(board[i][j] != word.charAt(index)) return false; // ์ผ์น˜ ์กฐ๊ฑด์„ ๋ถˆ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ
19+
20+
char temp = board[i][j];
21+
board[i][j] = '#';
22+
boolean found = dfs(board, i+1, j, word, index+1)
23+
|| dfs(board, i-1, j, word, index+1)
24+
|| dfs(board, i, j+1, word, index+1)
25+
|| dfs(board, i, j-1, word, index+1);
26+
27+
board[i][j] = temp;
28+
return found;
29+
}
30+
31+
// 2์ฐจ์› ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  direction ๋ฐฉํ–ฅ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ํ’€์ด
32+
public boolean exist2(char[][] board, String word) {
33+
int m = board.length;
34+
int n = board[0].length;
35+
boolean[][] visited = new boolean[m][n];
36+
boolean result = false;
37+
38+
for (int i = 0; i < m; i++) {
39+
for (int j = 0; j < n; j++) {
40+
if (board[i][j] == word.charAt(0)) {
41+
result = backtrack(board, word, visited, i, j, 0);
42+
if (result)
43+
return true;
44+
}
45+
}
46+
}
47+
48+
return false;
49+
}
50+
51+
private boolean backtrack(char[][] board, String word, boolean[][] visited, int i, int j, int index) {
52+
if (index == word.length()) {
53+
return true;
54+
}
55+
56+
// dfs๋ฅผ ํ’€ ๋•Œ๋Š” ๋ฐฐ์—ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ break๋ฅผ ๊ผญ ๊ธฐ์–ตํ•˜๊ธฐ
57+
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || visited[i][j]
58+
|| board[i][j] != word.charAt(index)) {
59+
return false;
60+
}
61+
62+
visited[i][j] = true;
63+
64+
// if๋ฌธ์—์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ˆˆ์— ์•ˆ ์ต์–ด์„œ
65+
// direction ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด์„œ for๋ฌธ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์•”๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜
66+
int[][] directions = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; // ๊ทธ๋ƒฅ ์•”๊ธฐ
67+
68+
for (int[] dir : directions) {
69+
// i๊ฐ€ y, j๊ฐ€ x์ธ๋ฐ ์‚ฌ์‹ค 1, -1, 0๋งŒ ์ž˜ ์„ค์ •ํ•˜๋ฉด ์ƒ๊ด€์—†์Œ. ๋ชฉ์ ์€ 1, -1 1๋ฒˆ์”ฉ ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋Š” 0์œผ๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ
70+
int nextI = i + dir[0];
71+
int nextJ = j + dir[1];
72+
73+
if (backtrack(board, word, visited, nextI, nextJ, index + 1)) {
74+
return true;
75+
}
76+
}
77+
78+
visited[i][j] = false;
79+
return false;
80+
}
81+
82+
}

0 commit comments

Comments
ย (0)