Skip to content

Commit 89ef0f5

Browse files
authored
Merge pull request #1577 from crumbs22/main
2 parents 837e685 + 3f6e23a commit 89ef0f5

File tree

5 files changed

+171
-0
lines changed

5 files changed

+171
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int maxPathSum(TreeNode* root) {
4+
int res = INT_MIN;
5+
6+
dfs(root, res);
7+
return res;
8+
}
9+
10+
int dfs(TreeNode* root, int& res) {
11+
if (!root)
12+
return 0;
13+
14+
// 쒌츑 λΆ€λΆ„νŠΈλ¦¬, 우츑 λΆ€λΆ„νŠΈλ¦¬λ₯Ό 각각 계산할 λ•Œ dfs의 'λ°˜ν™˜κ°’'을 ν™œμš©
15+
// μŒμˆ˜κ°’μ΄ λ‚˜μ˜¬ κ²½μš°λŠ” 0으둜 λŒ€μ²΄ν•¨
16+
int left = max(0, dfs(root->left, res));
17+
int right = max(0, dfs(root->right, res));
18+
19+
// μ΅œμ’… λ°˜ν™˜ν•  κ°’ μ—…λ°μ΄νŠΈ
20+
// 쒌츑 트리, 우츑 트리, 루트 λ…Έλ“œλ₯Ό λͺ¨λ‘ ν†΅κ³Όν•˜λŠ” κ²½λ‘œκ°€ ν˜„μž¬κΉŒμ§€ μ΅œλŒ“κ°’μΈμ§€ λΉ„κ΅ν•΄μ„œ κ°±μ‹ 
21+
res = max(res, root->val + left + right);
22+
23+
// μƒμœ„ λ…Έλ“œλ‘œ μ „λ‹¬λ˜λŠ” 값은 root의 값을 ν¬ν•¨ν•˜λŠ” 경둜의 값이닀
24+
// λ”°λΌμ„œ 쒌츑 트리 ν˜Ήμ€ 우츑 트리 쀑 ν•˜λ‚˜μ˜ κ²½λ‘œλ§Œμ„ μ„ νƒν•΄μ„œ 톡과할 수 μžˆλ‹€
25+
return root->val + max(left, right);
26+
}
27+
};

β€Žgraph-valid-tree/crumbs22.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
valid tree 쑰건
3+
1. 사이클이 μ—†μ–΄μ•Όν•œλ‹€
4+
2. λͺ¨λ“  각 λ…Έλ“œλ“€μ€ 적어도 ν•˜λ‚˜μ˜ λ‹€λ₯Έ λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€
5+
6+
인접 리슀트 ν˜•μ‹μœΌλ‘œ 무방ν–₯ κ°„μ„  정보λ₯Ό μ €μž₯ν•˜κ³ ,
7+
dfs μž¬κ·€ νƒμƒ‰μœΌλ‘œ λ°©λ¬Έ 체크 ν›„ μžμ‹ λ…Έλ“œλ₯Ό μž¬κ·€μ μœΌλ‘œ λ°©λ¬Έν•˜λ©΄μ„œ 사이클 νŒλ‹¨
8+
*/
9+
10+
class Solution {
11+
public:
12+
/**
13+
* @param n: An integer
14+
* @param edges: a list of undirected edges
15+
* @return: true if it's a valid tree, or false
16+
*/
17+
bool validTree(int n, vector<vector<int>> &edges) {
18+
if (edges.size() != n - 1)
19+
return false;
20+
21+
// μΈμ ‘ν•œ λ…Έλ“œλ“€μ„ μš”μ†Œλ‘œ κ°€μ§€λŠ” adj λ°°μ—΄ 생성
22+
vector<vector<int>> adj(n);
23+
24+
for (auto edge : edges) {
25+
int u = edge[0];
26+
int v = edge[1];
27+
adj[u].push_back(v);
28+
adj[v].push_back(u);
29+
}
30+
31+
// 방문 기둝
32+
vector<bool> visited(n, false);
33+
if (!dfs(0, -1, adj, visited))
34+
return false;
35+
36+
// λͺ¨λ“  λ…Έλ“œκ°€ λ°©λ¬Έλ˜μ—ˆλŠ”μ§€ (μ—°κ²°λ˜λŠ”μ§€) 확인
37+
for (bool v : visited) {
38+
if (!v)
39+
return false;
40+
}
41+
return true;
42+
}
43+
44+
bool dfs(int node, int parent, vector<vector<int>>& adj, vector<bool> visited) {
45+
visited[node] = true;
46+
47+
for (int neighbor : adj[node]) {
48+
if (neighbor == parent)
49+
continue ; // λ°”λ‘œ 이전 λ…Έλ“œλŠ” λ¬΄μ‹œ(왕볡 λ°©μ§€)
50+
if (visited[neighbor])
51+
return false; // 사이클 탐지
52+
if (!dfs(neighbor, node, adj, visited))
53+
return false;
54+
}
55+
return true;
56+
}
57+
};

β€Žmerge-intervals/crumbs22.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
이전 interval의 끝점과 ν˜„μž¬ interval의 μ‹œμž‘μ μ„ λΉ„κ΅ν•΄μ„œ ꡬ간 겹침을 νŒλ‹¨
3+
ꡬ간이 κ²ΉμΉœλ‹€λ©΄ prevλ₯Ό κ°±μ‹ 
4+
ꡬ간이 κ²ΉμΉ˜μ§€ μ•Šμ„ λ•Œ λ°˜ν™˜ 벑터 res에 prev μΆ”κ°€ν•˜κ³  기쀀점 κ°±μ‹ 
5+
intervalsλ₯Ό ν•œ 번 λ°˜λ³΅ν•˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„ O(n)κ³Ό 처음 정렬에 O(nlogn) μ†Œμš”λ˜λ―€λ‘œ
6+
μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„λŠ” O(nlogn)
7+
μΆ”κ°€μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 곡간은 λ°˜ν™˜λ°°μ—΄λ°–μ— μ—†μœΌλ―€λ‘œ O(1)의 κ³΅κ°„λ³΅μž‘λ„ 가짐
8+
*/
9+
10+
class Solution {
11+
public:
12+
vector<vector<int>> merge(vector<vector<int>>& intervals) {
13+
vector<vector<int>> res;
14+
15+
sort(intervals.begin(), intervals.end());
16+
17+
vector<int> prev = intervals[0];
18+
for (auto i : intervals) {
19+
if (i[0] <= prev[1]) {
20+
prev[0] = min(prev[0], i[0]);
21+
prev[1] = max(prev[1], i[1]);
22+
} else {
23+
res.push_back(prev); // 이전 병합 ꡬ간 μ €μž₯
24+
prev = i; // μƒˆλ‘œμš΄ κΈ°μ€€ μ‹œμž‘
25+
}
26+
}
27+
res.push_back(prev);
28+
29+
return res;
30+
}
31+
};

β€Žmissing-number/crumbs22.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
풀이방법: 0λΆ€ν„° nκΉŒμ§€μ˜ 합은 n*(n + 1)/2 μ΄λΌλŠ” μˆ˜ν•™μ  사싀을 ν™œμš©,
3+
nums 배열을 ν•œ 번만 μˆœνšŒν•˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)
4+
μΆ”κ°€μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 곡간 μ—†μœΌλ―€λ‘œ κ³΅κ°„λ³΅μž‘λ„λŠ” O(1)이닀.
5+
*/
6+
7+
class Solution {
8+
public:
9+
int missingNumber(vector<int>& nums) {
10+
int n = nums.size();
11+
int res = n * (n + 1) / 2;
12+
13+
for (int num : nums) {
14+
res -= num;
15+
}
16+
return (res);
17+
}
18+
};

β€Žreorder-list/crumbs22.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
큐와 μŠ€νƒκ΅¬μ‘°λ₯Ό ν™œμš©ν•΄ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό 각각 μ €μž₯해놓고
3+
νμ—μ„œ ν•œ 번, μŠ€νƒμ—μ„œ ν•œ 번 μš”μ†Œλ₯Ό λΉΌμ™€μ„œ μž¬μ •λ ¬ν•œλ‹€
4+
λ§ν¬λ“œλ¦¬μŠ€νŠΈλ₯Ό ν•œ 번 μˆœνšŒν•˜λ©΄μ„œ pushν•˜κ³  같은 길이만큼 ν•œ 번 더 μˆœνšŒν•˜λ―€λ‘œ O(2n)의 μ‹œκ°„λ³΅μž‘λ„μ™€
5+
λ…Έλ“œ 길이만큼의 자료ꡬ쑰λ₯Ό 2개 더 μ‚¬μš©ν•˜λ―€λ‘œ O(2n)의 κ³΅κ°„λ³΅μž‘λ„λ₯Ό μ‚¬μš©
6+
*/
7+
8+
class Solution {
9+
public:
10+
void reorderList(ListNode* head) {
11+
ListNode* tmp = head;
12+
queue<ListNode*> q;
13+
stack<ListNode*> s;
14+
15+
while (tmp) {
16+
s.push(tmp);
17+
q.push(tmp);
18+
tmp = tmp->next;
19+
}
20+
21+
// 큐 - μŠ€νƒ - 큐 - μŠ€νƒ ...
22+
// νλŠ” μ•žμ—μ„œ 1/2을, μŠ€νƒμ€ λ’€μ—μ„œ 1/2을 λ°˜λ³΅ν•˜λ©° μš”μ†Œ μΆ”μΆœ
23+
int len = q.size();
24+
tmp = q.front();
25+
q.pop();
26+
27+
for (int i = 0; i < len / 2; i++) {
28+
tmp->next = s.top();
29+
s.pop();
30+
tmp = tmp->next;
31+
tmp->next = q.front();
32+
q.pop();
33+
tmp = tmp->next;
34+
}
35+
tmp->next = nullptr;
36+
37+
}
38+
};

0 commit comments

Comments
Β (0)