Skip to content

Commit 00579e2

Browse files
authored
Merge pull request #2436 from hwi-middle/main
[hwi-middle] WEEK 03 solutions
2 parents 93dca81 + bb1b12e commit 00579e2

5 files changed

Lines changed: 150 additions & 0 deletions

File tree

combination-sum/hwi-middle.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
4+
vector<vector<int>> res;
5+
vector<int> v;
6+
7+
solve(candidates, target, v, 0, res, 0);
8+
return res;
9+
}
10+
11+
/**
12+
* @param candidates 사용할 수 있는 수의 후보
13+
* @param target candidates의 원소들을 사용해 만들어야하는 합계
14+
* @param cur 지금까지 시도한 조합
15+
* @param sum 사전에 계산된 cur 원소들의 합계
16+
* @param res 최종 결과
17+
* @param idx 현재까지 진행된 인덱스 (중복 방지를 위해 존재)
18+
*/
19+
void solve(const vector<int>& candidates, const int target, vector<int>& cur, int sum, vector<vector<int>>& res, int idx)
20+
{
21+
if (sum > target)
22+
{
23+
return;
24+
}
25+
26+
if (sum == target)
27+
{
28+
res.push_back(cur);
29+
return;
30+
}
31+
32+
int len = candidates.size();
33+
for (int i = idx; i < len; ++i)
34+
{
35+
int c = candidates[i];
36+
cur.push_back(c);
37+
solve(candidates, target, cur, sum + c, res, i);
38+
cur.pop_back();
39+
}
40+
}
41+
};

decode-ways/hwi-middle.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public:
3+
int numDecodings(string s) {
4+
int d[101];
5+
int len = s.size();
6+
7+
if (s[0] == '0') // 0으로 시작할 수 없음
8+
{
9+
return 0;
10+
}
11+
12+
d[0] = 1; // 빈 문자열 -> 1가지 방법
13+
d[1] = 1; // 첫 문자 -> 1가지 방법 (0이 아닌건 확인했음)
14+
15+
for (int i = 2; i <= len; ++i)
16+
{
17+
d[i] = 0;
18+
19+
// 0이 아니어서 단독으로 해석 가능한 경우
20+
if (s[i - 1] != '0')
21+
{
22+
d[i] += d[i - 1];
23+
}
24+
25+
// 앞글자와 조합해서 유효한 두 자리가 될 수 있는 경우
26+
if (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))
27+
{
28+
d[i] += d[i - 2];
29+
}
30+
}
31+
32+
return d[len];
33+
}
34+
};

maximum-subarray/hwi-middle.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int maxSubArray(vector<int>& nums) {
4+
int cur = 0;
5+
int ans = -1e5;
6+
for (int n : nums)
7+
{
8+
// 이전까지 합이 음수라면 무조건 다시 시작하는게 이득
9+
if (cur < 0)
10+
{
11+
cur = 0;
12+
}
13+
14+
cur += n;
15+
ans = max(cur, ans);
16+
}
17+
18+
return ans;
19+
}
20+
};

number-of-1-bits/hwi-middle.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int hammingWeight(int n) {
4+
// 아주 간편한 풀이가 있지만...
5+
// return __builtin_popcount(n);
6+
7+
// 직접 해보기
8+
int cnt = 0;
9+
for (unsigned int i = 1 << 31; i > 0; i /= 2)
10+
{
11+
if ((n & i) != 0)
12+
{
13+
cnt++;
14+
}
15+
}
16+
17+
return cnt;
18+
}
19+
};

valid-palindrome/hwi-middle.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public:
3+
bool isPalindrome(string s) {
4+
int len = s.size();
5+
int l = 0;
6+
int r = len - 1;
7+
8+
while (l <= r)
9+
{
10+
while (l <= r &&!isalnum(s[l]))
11+
{
12+
l++;
13+
}
14+
15+
while (l <= r && !isalnum(s[r]))
16+
{
17+
r--;
18+
}
19+
20+
if (l > r)
21+
{
22+
break;
23+
}
24+
25+
if (tolower(s[l]) != tolower(s[r]))
26+
{
27+
return false;
28+
}
29+
30+
l++;
31+
r--;
32+
}
33+
34+
return true;
35+
}
36+
};

0 commit comments

Comments
 (0)