Skip to content

Commit dc326db

Browse files
authored
Merge pull request #1601 from crumbs22/main
[crumbs22] Week 12 Solutions
2 parents 052a29e + a8af0f7 commit dc326db

File tree

5 files changed

+151
-0
lines changed

5 files changed

+151
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
4+
5+
// 끝나는 시간을 기준으로 정렬
6+
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; });
7+
8+
int count = 1; // 첫 구간은 항상 선택
9+
int end = intervals[0][1]; // 첫 구간의 끝
10+
11+
for (int i = 1; i < intervals.size(); i++) {
12+
// 현재 구간이 겹치지 않으면 선택
13+
if (intervals[i][0] >= end) {
14+
count++;
15+
end = intervals[i][1];
16+
}
17+
}
18+
19+
// 제거해야 하는 구간 수 = 전체 - 선택된 개수
20+
return intervals.size() - count;
21+
}
22+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
3+
*/
4+
class Solution {
5+
public:
6+
int countComponents(int n, vector<vector<int>> &edges) {
7+
vector<vector<int>> graph(n);
8+
vector<bool> visited(n, false);
9+
10+
for (auto edge : edges) {
11+
int u = edge[0];
12+
int v = edge[1];
13+
graph[u].push_back(v);
14+
graph[v].push_back(u);
15+
}
16+
17+
int cnt = 0;
18+
for (int i = 0; i < n; i++) {
19+
if (!visited[i]) {
20+
dfs(i, graph, visited);
21+
cnt++;
22+
}
23+
}
24+
return cnt;
25+
}
26+
27+
void dfs(int node, vector<vector<int>> &graph, vector<bool> &visited) {
28+
visited[node] = true;
29+
for (int neighbor : graph[node]) {
30+
if (!visited[neighbor]) {
31+
dfs(neighbor, graph, visited);
32+
}
33+
}
34+
}
35+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
노드의 개수 cnt를 세고, n과 cnt를 통해 움직여야 할 위치 mv를 계산한다
3+
mv가 0일 때 첫번째 노드를 제거하므로 head->next를 반환
4+
mv가 0이 아닐 때는 head부터 mv만큼 이동한 후, 그 노드의 이전 노드(fh)와 다음 노드(tmp->next)를 연결한다
5+
시간복잡도는 O(n)이고 추가적인 공간은 사용하지 않으므로 공간복잡도는 O(1)이다
6+
*/
7+
class Solution {
8+
public:
9+
ListNode* removeNthFromEnd(ListNode* head, int n) {
10+
11+
int cnt = 0;
12+
ListNode* end = head;
13+
while (end) {
14+
end = end->next;
15+
cnt++;
16+
}
17+
18+
int mv = cnt - n;
19+
if (mv == 0)
20+
return (head->next);
21+
ListNode* fh = nullptr;
22+
ListNode* tmp = head;
23+
for (int i = 0; i < mv; i++) {
24+
fh = tmp;
25+
tmp = tmp->next;
26+
}
27+
if (!fh)
28+
return (nullptr);
29+
if (tmp->next)
30+
fh->next = tmp->next;
31+
else
32+
fh->next = nullptr;
33+
return (head);
34+
}
35+
};

same-tree/crumbs22.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
전위순회 하면서 두 트리가 같은지 비교
3+
재귀적으로 탐색하므로
4+
두 트리의 자식노드 중 하나라도 없다면 탈출한다
5+
p->val == q->val 조건이 아닌 p->val != q->val 조건을 판단해야
6+
p->val과 q->val이 같을 때 그 다음 자식노드로 내려가는 return문으로 빠질 수 있다
7+
(p->val == q->val 조건을 사용하면 true가 반환되므로 중간에 종결된다)
8+
시간복잡도는 트리의 높이와 같다
9+
다른 추가적 공간은 사용하지 않으므로 공간복잡도는 O(1)이다
10+
*/
11+
class Solution {
12+
public:
13+
bool isSameTree(TreeNode* p, TreeNode* q) {
14+
15+
if (!p && !q)
16+
return (true);
17+
if (!p || !q)
18+
return (false);
19+
if (p->val != q->val)
20+
return (false);
21+
22+
return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
23+
}
24+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Codec {
2+
public:
3+
string serialize(TreeNode* root) {
4+
string res;
5+
dfs(root, res);
6+
return res;
7+
}
8+
9+
TreeNode* deserialize(string data) {
10+
istringstream iss(data);
11+
return dfs(iss);
12+
}
13+
14+
private:
15+
void dfs(TreeNode* node, string& res) {
16+
if (!node) {
17+
res += "N,";
18+
return;
19+
}
20+
res += to_string(node->val) + ",";
21+
dfs(node->left, res);
22+
dfs(node->right, res);
23+
}
24+
25+
TreeNode* dfs(istringstream& iss) {
26+
string val;
27+
getline(iss, val, ','); // ','를 기준으로 하나씩 읽음
28+
if (val == "N") return nullptr;
29+
30+
TreeNode* node = new TreeNode(stoi(val));
31+
node->left = dfs(iss);
32+
node->right = dfs(iss);
33+
return node;
34+
}
35+
};

0 commit comments

Comments
 (0)