Skip to content

Commit 1d55b0f

Browse files
authored
Merge pull request #513 from jaejeong1/main
[jaejeong1] Week 08 Solutions
2 parents f99d21c + 1e53764 commit 1d55b0f

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

clone-graph/jaejeong1.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import java.util.ArrayList;
2+
import java.util.HashMap;
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Queue;
7+
8+
// Definition for a Node.
9+
class Node {
10+
public int val;
11+
public List<Node> neighbors;
12+
public Node() {
13+
val = 0;
14+
neighbors = new ArrayList<Node>();
15+
}
16+
public Node(int _val) {
17+
val = _val;
18+
neighbors = new ArrayList<Node>();
19+
}
20+
public Node(int _val, ArrayList<Node> _neighbors) {
21+
val = _val;
22+
neighbors = _neighbors;
23+
}
24+
}
25+
26+
27+
class Solution {
28+
// 풀이: BFS 방식으로 그래프를 순회하면서 현재 노드에 연결된 노드들을 복제 여부에 따라 복제 또는 연결 처리해준다
29+
// TC: O(N)
30+
// SC: O(N)
31+
public Node cloneGraph(Node node) {
32+
if (node == null) {
33+
return null;
34+
}
35+
36+
Map<Node, Node> cloneMap = new HashMap<>();
37+
Node clone = new Node(node.val);
38+
cloneMap.put(node, clone);
39+
40+
Queue<Node> queue = new LinkedList<>();
41+
queue.add(node);
42+
43+
while (!queue.isEmpty()) {
44+
Node current = queue.poll();
45+
46+
for (Node neighbor : current.neighbors) {
47+
if (!cloneMap.containsKey(neighbor)) {
48+
cloneMap.put(neighbor, new Node(neighbor.val));
49+
queue.add(neighbor);
50+
}
51+
cloneMap.get(current).neighbors.add(cloneMap.get(neighbor));
52+
}
53+
}
54+
return clone;
55+
}
56+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import java.util.Collections;
2+
import java.util.HashMap;
3+
import java.util.Map;
4+
5+
class Solution {
6+
public int characterReplacement(String s, int k) {
7+
// 풀이: 슬라이딩 윈도우를 활용해 부분 문자열을 구한다
8+
// 종료 인덱스를 증가시키고, 부분 문자열 길이에서 가장 많이 들어있는 문자의 수를 뺀 값이 k보다 큰지 비교한다.
9+
// 크다면, 시작 인덱스를 증가시킨다.
10+
// 끝까지 반복하면서 최대 길이를 저장했다가 반환한다.
11+
// TC: O(N)
12+
// SC: O(N)
13+
var maxLength = 0;
14+
var start = 0;
15+
var end = 0;
16+
Map<Character, Integer> countByChar = new HashMap<>();
17+
18+
while (end < s.length()) {
19+
countByChar.put(s.charAt(end), countByChar.getOrDefault(s.charAt(end), 0) + 1);
20+
21+
while ((end - start + 1 - Collections.max(countByChar.values())) > k) {
22+
countByChar.put(s.charAt(start), countByChar.get(s.charAt(start)) - 1);
23+
start += 1;
24+
}
25+
maxLength = Math.max(end - start + 1, maxLength);
26+
end++;
27+
}
28+
29+
return maxLength;
30+
}
31+
}

merge-two-sorted-lists/jaejeong1.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import java.util.List;
2+
3+
// Definition for singly-linked list.
4+
class ListNode {
5+
int val;
6+
ListNode next;
7+
ListNode() {}
8+
ListNode(int val) { this.val = val; }
9+
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
10+
}
11+
12+
class Solution {
13+
14+
public static void main(String[] args) {
15+
Solution s = new Solution();
16+
var list1 = new ListNode(1);
17+
list1.next = new ListNode(2);
18+
list1.next.next = new ListNode(4);
19+
20+
var list2 = new ListNode(1);
21+
list2.next = new ListNode(3);
22+
list2.next.next = new ListNode(4);
23+
24+
System.out.println(s.mergeTwoLists(list1, list2));
25+
}
26+
27+
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
28+
// A와 B 헤드를 비교
29+
// A가 더 작거나 같으면 A 헤드를 빼서 새 노드로 추가
30+
// 그렇지 않으면 B 헤드를 빼서 새 노드로 추가
31+
// TC: O(N+M), N: list1의 길이, M: list2의 길이
32+
// SC: O(N+M), N: list1의 길이, M: list2의 길이
33+
ListNode mergedList = null;
34+
35+
while(list1 != null && list2 != null) {
36+
if (list1.val <= list2.val) {
37+
mergedList = addNode(mergedList, list1.val);
38+
list1 = list1.next;
39+
} else {
40+
mergedList = addNode(mergedList, list2.val);
41+
list2 = list2.next;
42+
}
43+
}
44+
45+
while(list1 != null) {
46+
mergedList = addNode(mergedList, list1.val);
47+
list1 = list1.next;
48+
}
49+
50+
while(list2 != null) {
51+
mergedList = addNode(mergedList, list2.val);
52+
list2 = list2.next;
53+
}
54+
55+
return mergedList;
56+
}
57+
58+
private ListNode addNode(ListNode node, int val) {
59+
if (node == null) {
60+
node = new ListNode(val);
61+
} else {
62+
var last = node;
63+
while(last.next != null) {
64+
last = last.next;
65+
}
66+
last.next = new ListNode(val);
67+
}
68+
69+
return node;
70+
}
71+
}

0 commit comments

Comments
 (0)