Skip to content

Commit c5684bb

Browse files
authored
Merge pull request #1258 from sungjinwi/main
[sungjinwi] Week 02 solution
2 parents 2dc0ba7 + 3dc6c7d commit c5684bb

File tree

5 files changed

+209
-0
lines changed

5 files changed

+209
-0
lines changed

3sum/sungjinwi.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
풀이 :
3+
nums 배열을 정렬시킨 후 반복되는 값을 건너뛰며 두 포인터 기법을 사용한다
4+
i포인터와 left, right 포인터의 값의 합이 0보다 작으면 left++, 크면 right--
5+
0이면 ans에 저장하고 left++, right--하는 로직을 left < right인 동안 반복한다
6+
7+
nums의 길이 N
8+
9+
TC : O(N^2)
10+
외부 반복문 N * 내부 반복문 N
11+
12+
SC : O(1) (ans 제외)
13+
left, right, threeSum 3개의 변수만 사용한다
14+
*/
15+
16+
#include <vector>
17+
#include <algorithm>
18+
using namespace std;
19+
20+
class Solution {
21+
public:
22+
vector<vector<int>> threeSum(vector<int>& nums) {
23+
vector<vector<int>> ans;
24+
int left;
25+
int right;
26+
int threeSum;
27+
28+
sort(nums.begin(), nums.end());
29+
for (int i = 0; i < nums.size() - 2; i++)
30+
{
31+
// i포인터 중복 제거
32+
if (i > 0 && nums[i] == nums[i - 1])
33+
continue ;
34+
35+
left = i + 1;
36+
right = nums.size() - 1;
37+
while (left < right)
38+
{
39+
threeSum = nums[i] + nums[left] + nums[right];
40+
if (threeSum < 0)
41+
left++;
42+
else if(threeSum > 0)
43+
right--;
44+
else
45+
{
46+
ans.push_back({nums[i], nums[left], nums[right]});
47+
// left포인터 중복 제거
48+
while (left < right && nums[left] == nums[left + 1])
49+
left++;
50+
// right 포인터 중복 제거
51+
while (left < right && nums[right] == nums[right - 1])
52+
right--;
53+
left++;
54+
right--;
55+
}
56+
}
57+
}
58+
return ans;
59+
}
60+
};

climbing-stairs/sungjinwi.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
풀이 :
3+
n이 1과 2일 떄는 따로 처리, 그 외에 n번째는 prv(n - 2번째) + cur(n -1번째)로 값을 업데이트 하며 n까지 더해나감
4+
5+
TC : O(N)
6+
n의 크기에 반복문이 비례한다
7+
8+
SC : O(1)
9+
n의 크기와 상관없이 3개의 변수 사용
10+
*/
11+
12+
class Solution {
13+
public:
14+
int climbStairs(int n) {
15+
if (n == 1)
16+
return 1;
17+
if (n == 2)
18+
return 2;
19+
20+
int prv = 1;
21+
int cur = 2;
22+
int tmp;
23+
for (int i = 3; i <= n; i++)
24+
{
25+
tmp = cur;
26+
cur = cur + prv;
27+
prv = tmp;
28+
}
29+
return cur;
30+
}
31+
};
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
풀이 :
3+
해당 인덱스 이전 값들의 곱을 before에 저장(인덱스 0 이전에는 값이 없으므로 1로 초기화)
4+
해당 인덱스 이후 값들의 곱을 after에 저장(인덱스 n - 1이후에는 값이 없으므로 1로 초기화)
5+
인덱스 0부터 반복문을 돌며 ans에 인덱스 이전값들의 곱 before를 곱함 & before값에 현재 num을 곱함
6+
인덱스 끝부터 반복문을 돌며 after를 이용해 동일 작업
7+
8+
nums의 길이 : N
9+
10+
TC : O(N)
11+
반복문 2회 O(N + N)
12+
13+
SC : O(1) (ans배열 제외)
14+
N에 관계없이 before와 after 변수만 사용
15+
*/
16+
17+
#include <vector>
18+
using namespace std;
19+
20+
class Solution {
21+
public:
22+
vector<int> productExceptSelf(vector<int>& nums) {
23+
int before = 1;
24+
int after = 1;
25+
vector<int> ans(nums.size(), 1);
26+
27+
for (int i = 0; i < nums.size(); i++)
28+
{
29+
ans[i] *= before;
30+
before *= nums[i];
31+
}
32+
for (int i = nums.size() - 1; i >= 0; i--)
33+
{
34+
ans[i] *= after;
35+
after *= nums[i];
36+
}
37+
return ans;
38+
}
39+
};

valid-anagram/sungjinwi.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
풀이 :
3+
해시테이블에 string을 순회하며 문자 : 빈도로 값 저장 후 두 데이터가 같은 지 비교
4+
5+
TC : O(S + T)
6+
SC : O(S + T)
7+
*/
8+
9+
#include <unordered_map>
10+
#include <string>
11+
using namespace std;
12+
13+
class Solution {
14+
public:
15+
bool isAnagram(string s, string t) {
16+
unordered_map<char, int> s_map;
17+
unordered_map<char, int> t_map;
18+
19+
for (char c : s)
20+
s_map[c]++;
21+
for (char c : t)
22+
t_map[c]++;
23+
24+
return (s_map == t_map);
25+
}
26+
};
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
풀이 :
3+
중위순회로 BST를 탐색하면 오름차순으로 탐색
4+
->중위순회 했을 떄 오름차순이 아니면 BST가 아니다
5+
현재 node의 val이 last_val보다 더 큰지 확인하면서 탐색한다
6+
7+
초기값은 INT_MIN이 있을경우를 생각해서 그보다 작은 값과 비교하기 위해 LONG_MIN사용
8+
9+
node 갯수 N
10+
11+
TC : O(N)
12+
노드 전체 순회
13+
14+
SC : O(N)
15+
재귀 호출스택이 N에 비례
16+
*/
17+
18+
#include <limits.h>
19+
20+
// Definition for a binary tree node.
21+
struct TreeNode {
22+
int val;
23+
TreeNode *left;
24+
TreeNode *right;
25+
TreeNode() : val(0), left(nullptr), right(nullptr) {}
26+
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
27+
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
28+
};
29+
30+
class Solution {
31+
public:
32+
bool isValidBST(TreeNode* root) {
33+
long min = LONG_MIN;
34+
return dfs(root, &min);
35+
}
36+
37+
bool dfs(TreeNode* node, long* last_val){
38+
if (!node)
39+
return true;
40+
41+
if (!dfs(node->left, last_val))
42+
return false;
43+
44+
if (*last_val >= node->val)
45+
return false;
46+
*last_val = node->val;
47+
48+
if (!dfs(node->right, last_val))
49+
return false;
50+
51+
return true;
52+
}
53+
};

0 commit comments

Comments
 (0)