Skip to content

Commit eb472eb

Browse files
authored
Merge pull request #1640 from Tessa1217/week14
[Tessa1217] Week14 Solutions
2 parents fe87566 + 43c8572 commit eb472eb

File tree

5 files changed

+291
-0
lines changed

5 files changed

+291
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import java.util.ArrayList;
2+
import java.util.LinkedList;
3+
import java.util.List;
4+
import java.util.Queue;
5+
6+
/**
7+
* Definition for a binary tree node.
8+
* public class TreeNode {
9+
* int val;
10+
* TreeNode left;
11+
* TreeNode right;
12+
* TreeNode() {}
13+
* TreeNode(int val) { this.val = val; }
14+
* TreeNode(int val, TreeNode left, TreeNode right) {
15+
* this.val = val;
16+
* this.left = left;
17+
* this.right = right;
18+
* }
19+
* }
20+
*/
21+
class Solution {
22+
23+
// DFS 풀이
24+
public List<List<Integer>> levelOrder(TreeNode root) {
25+
List<List<Integer>> result = new ArrayList<>();
26+
dfs(root, 0, result);
27+
return result;
28+
}
29+
30+
private void dfs(TreeNode node, int depth, List<List<Integer>> result) {
31+
if (node == null) {
32+
return;
33+
}
34+
35+
// 깊이만큼의 리스트가 없으면 새 리스트 추가하기
36+
if (depth == result.size()) {
37+
result.add(new ArrayList<>());
38+
}
39+
40+
result.get(depth).add(node.val);
41+
42+
dfs(node.left, depth + 1, result);
43+
dfs(node.right, depth + 1, result);
44+
45+
46+
}
47+
48+
// BFS로 풀이
49+
// O(n)
50+
// public List<List<Integer>> levelOrder(TreeNode root) {
51+
//
52+
// List<List<Integer>> result = new ArrayList<>();
53+
//
54+
// if (root == null) {
55+
// return result;
56+
// }
57+
//
58+
// Queue<TreeNode> queue = new LinkedList<>();
59+
// queue.offer(root);
60+
//
61+
// while (!queue.isEmpty()) {
62+
// int nodeCnt = queue.size();
63+
// List<Integer> currentLevelNodes = new ArrayList<>();
64+
//
65+
// for (int i = 0; i < nodeCnt; i++) {
66+
// TreeNode current = queue.poll();
67+
// currentLevelNodes.add(current.val);
68+
//
69+
// if (current.left != null) {
70+
// queue.offer(current.left);
71+
// }
72+
//
73+
// if (current.right != null) {
74+
// queue.offer(current.right);
75+
// }
76+
//
77+
// }
78+
//
79+
// result.add(currentLevelNodes);
80+
//
81+
// }
82+
//
83+
// return result;
84+
//
85+
// }
86+
}
87+

counting-bits/Tessa1217.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
3+
// 시간복잡도: O(n)
4+
public int[] countBits(int n) {
5+
int[] bitsArray = new int[n + 1];
6+
for (int i = 1; i <= n; i++) {
7+
// Shift 연산자 사용
8+
// i&1 => 마지막 비트가 0인지 1인지 확인
9+
bitsArray[i] = bitsArray[i >> 1] + (i & 1);
10+
}
11+
return bitsArray;
12+
}
13+
}
14+

house-robber-ii/Tessa1217.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
class Solution {
2+
3+
// DP
4+
public int rob(int[] nums) {
5+
int n = nums.length;
6+
7+
if (n == 0) {
8+
return 0;
9+
}
10+
11+
if (n == 1) {
12+
return nums[0];
13+
}
14+
15+
int notRobbingLast = robHouses(nums, 0, n - 2);
16+
int notRobbingFirst = robHouses(nums, 1, n - 1);
17+
18+
return Math.max(notRobbingLast, notRobbingFirst);
19+
}
20+
21+
private int robHouses(int[] nums, int start, int end) {
22+
23+
int length = end - start + 1;
24+
25+
if (length == 0) {
26+
return 0;
27+
}
28+
29+
if (length == 1) {
30+
return nums[start];
31+
}
32+
33+
int[] dp = new int[length];
34+
35+
dp[0] = nums[start];
36+
dp[1] = Math.max(nums[start], nums[start + 1]);
37+
38+
for (int i = 2; i < length; i++) {
39+
dp[i] = Math.max(dp[i - 2] + nums[start + i], dp[i - 1]);
40+
}
41+
42+
return dp[length - 1];
43+
}
44+
}
45+

meeting-rooms-ii/Tessa1217.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.util.List;
2+
import java.util.PriorityQueue;
3+
4+
/**
5+
* Definition of Interval:
6+
* public class Interval {
7+
* int start, end;
8+
* Interval(int start, int end) {
9+
* this.start = start;
10+
* this.end = end;
11+
* }
12+
* }
13+
*/
14+
15+
public class Solution {
16+
/**
17+
* @param intervals: an array of meeting time intervals
18+
* @return: the minimum number of conference rooms required
19+
*/
20+
// 시간복잡도: O(n log n)
21+
public int minMeetingRooms(List<Interval> intervals) {
22+
23+
if (intervals == null || intervals.isEmpty()) {
24+
return 0;
25+
}
26+
27+
// 주어진 시간 인터벌 리스트를 시작 시간 기준으로 정렬
28+
intervals.sort((i1, i2) -> i1.start - i2.start);
29+
30+
// PriorityQueue 선언: 시간 interval의 end time 기준
31+
PriorityQueue<Interval> meetingRooms = new PriorityQueue<>((i1, i2) -> i1.end - i2.end);
32+
33+
for (Interval interval : intervals) {
34+
35+
// 최초 meeting room
36+
if (meetingRooms.isEmpty()) {
37+
meetingRooms.offer(interval);
38+
continue;
39+
}
40+
41+
Interval meeting = meetingRooms.peek();
42+
// (0, 8), (8, 10) is not conflict at 8
43+
if (meeting.end <= interval.start) {
44+
// 앞의 회의 종료되었으므로 회의실 재사용
45+
meetingRooms.poll();
46+
}
47+
// 새 회의실 추가
48+
meetingRooms.offer(interval);
49+
}
50+
51+
return meetingRooms.size();
52+
53+
}
54+
}
55+

word-search-ii/Tessa1217.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
class Solution {
5+
6+
private int[] dx = {0, 0, 1, -1};
7+
private int[] dy = {1, -1, 0, 0};
8+
9+
private int m;
10+
private int n;
11+
12+
class TrieNode {
13+
// 단어는 영어 소문자만으로 이루어짐
14+
TrieNode[] nodes = new TrieNode[26];
15+
String word = null;
16+
}
17+
18+
private void insert(TrieNode root, String word) {
19+
TrieNode node = root;
20+
for (char c : word.toCharArray()) {
21+
int idx = c - 'a';
22+
if (node.nodes[idx] == null) {
23+
node.nodes[idx] = new TrieNode();
24+
}
25+
node = node.nodes[idx];
26+
}
27+
// 단어
28+
node.word = word;
29+
}
30+
31+
public List<String> findWords(char[][] board, String[] words) {
32+
33+
List<String> existingWords = new ArrayList<>();
34+
35+
// 탐색 최적화를 위해 TrieNode 생성
36+
TrieNode root = new TrieNode();
37+
for (String word : words) {
38+
insert(root, word);
39+
}
40+
41+
m = board.length;
42+
n = board[0].length;
43+
44+
for (int i = 0; i < m; i++) {
45+
for (int j = 0; j < n; j++) {
46+
dfs(board, i, j, root, existingWords);
47+
}
48+
}
49+
50+
return existingWords;
51+
}
52+
53+
private void dfs(char[][] board, int i, int j, TrieNode node, List<String> existingWords) {
54+
55+
char c = board[i][j];
56+
57+
// 방문 처리 되었거나 TrieNode에 없는 글자라면 탐색 X => Pruning
58+
if (c == '#' || node.nodes[c - 'a'] == null) {
59+
return;
60+
}
61+
62+
node = node.nodes[c - 'a'];
63+
64+
// node의 완성된 단어가 있다면
65+
if (node.word != null) {
66+
existingWords.add(node.word);
67+
node.word = null;
68+
}
69+
70+
// 방문 처리
71+
board[i][j] = '#';
72+
73+
for (int idx = 0; idx < 4; idx++) {
74+
int ni = i + dx[idx];
75+
int nj = j + dy[idx];
76+
if (isRange(ni, nj)) {
77+
dfs(board, ni, nj, node, existingWords);
78+
}
79+
}
80+
81+
board[i][j] = c;
82+
}
83+
84+
// 탐색 범위 조건
85+
private boolean isRange(int i, int j) {
86+
return i >= 0 && j >= 0 && i < m && j < n;
87+
}
88+
89+
}
90+

0 commit comments

Comments
 (0)