Skip to content

Commit d7ef7df

Browse files
authored
Merge pull request #1783 from jinvicky/main
[jinvicky] WEEK 03 solutions
2 parents 9d0d157 + 4e7bb8d commit d7ef7df

File tree

5 files changed

+188
-0
lines changed

5 files changed

+188
-0
lines changed

combination-sum/jinvicky.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
class Solution {
5+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
6+
List<List<Integer>> answer = new ArrayList<>();
7+
8+
makeCombination(candidates, target, 0, new ArrayList<>(), 0, answer);
9+
return answer;
10+
}
11+
12+
private void makeCombination(int[] candidates,
13+
int target,
14+
int idx,
15+
List<Integer> comb,
16+
int total,
17+
List<List<Integer>> res) {
18+
if (total == target) {
19+
res.add(new ArrayList<>(comb));
20+
return;
21+
}
22+
23+
if (total > target || idx >= candidates.length) {
24+
return;
25+
}
26+
27+
comb.add(candidates[idx]);
28+
makeCombination(candidates, target, idx, comb, total + candidates[idx], res);
29+
comb.remove(comb.size() - 1);
30+
makeCombination(candidates, target, idx + 1, comb, total, res);
31+
}
32+
}

decode-ways/jinvicky.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public int numDecodings(String s) {
3+
if (s.charAt(0) == '0') return 0;
4+
5+
int n = s.length();
6+
int[] dp = new int[n+1];
7+
dp[0] = dp[1] = 1;
8+
9+
for(int i = 2; i <= n; i++) {
10+
int one = Character.getNumericValue(s.charAt(i-1));
11+
int two = Integer.parseInt(s.substring(i-2, i));
12+
13+
if(1 <= one && one <= 9) {
14+
dp[i] += dp[i-1];
15+
}
16+
if(10 <= two && two <= 26) {
17+
dp[i] += dp[i-2];
18+
}
19+
}
20+
21+
return dp[n];
22+
}
23+
}

maximum-subarray/jinvicky.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// [참고]
2+
// 카데인 알고리즘: 이전요소의 부분합을 알면 현재요소의 최대값을 알 수 있다.
3+
// 양수만이라면 단순히 dp로 dp[nums.length-1] 값이나 total이라는 계산값을 리턴하겠지만,
4+
// 음수가 포함되었으므로 bestSum과 currentSum을 별개의 변수로 처리한다.
5+
// currentSum은 최대 sum을 구해야 하므로 음수값일때 강제로 0으로 업데이트 후 계산을 실행한다.
6+
// https://velog.io/@wind1992/Leetcode-53.-Maximum-Subarray
7+
//
8+
// [풀이방식]
9+
// 1. 카데인 알고리즘 2. DP
10+
// [성능]
11+
// dp 배열보다 변수를 사용하는 것이 공간 복잡도를 줄일 수 있다. 또한 for문 1개로 해결 가능하다.
12+
class Solution {
13+
public int maxSubArray(int[] nums) {
14+
int bestSum = nums[0];
15+
int currentSum = 0;
16+
17+
for (int n : nums) {
18+
if (currentSum < 0) { // 1. 업데이트
19+
currentSum = 0;
20+
}
21+
22+
// 2. 계산
23+
currentSum += n;
24+
bestSum = Math.max(currentSum, bestSum);
25+
}
26+
return bestSum;
27+
}
28+
29+
public int maxSubArrayDp(int[] nums) {
30+
int n = nums.length;
31+
int[] dp = new int[n];
32+
33+
dp[0] = nums[0];
34+
int maxSum = dp[0];
35+
36+
for (int i = 1; i < n; i++) {
37+
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
38+
maxSum = Math.max(maxSum, dp[i]);
39+
}
40+
41+
return maxSum;
42+
}
43+
}

number-of-1-bits/jinvicky.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Solution {
2+
// [sol1] 반복문을 사용하면서 ((n>>i) & 1) == 1를 만족하는 개수를 구한다.
3+
// n을 변경하지 않지만 [sol1-1]보다 느리다.
4+
public int hammingWeight(int n) {
5+
int answer = 0;
6+
for(int i = 0; i < 32; i++) {
7+
// >> 연산자를 이용하여 값을 오른쪽으로 bitwise 연산을 한다.
8+
if(((n>>i) & 1) == 1) {
9+
answer+=1;
10+
}
11+
}
12+
return answer;
13+
}
14+
15+
// [sol1-1] n 값이 변경되면서 [sol1]보다 성능이 개선된다.
16+
public int hammingWeight1_1(int n) {
17+
int answer = 0;
18+
for (int i = 0; i < 32; i++) {
19+
answer += (n & 1);
20+
n >>>= 1;
21+
}
22+
return answer;
23+
}
24+
25+
// [sol2] 자바를 사용한다면 1개의 메서드, 1줄의 코드로 해결할 수 있다.
26+
public int hammingWeight2 (int n) {
27+
return Integer.bitCount(n);
28+
}
29+
30+
// [sol3] 1의 개수만큼만 반복한다.
31+
// 예) n = 1011 -> 1000 -> 0000 종료
32+
public int hammingWeight3(int n) {
33+
int answer = 0;
34+
while (n != 0) {
35+
n &= (n - 1); // 가장 오른쪽 1 비트를 0으로 만듦
36+
answer++;
37+
}
38+
return answer;
39+
}
40+
}

valid-palindrome/jinvicky.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class Solution {
2+
3+
/**
4+
* 런타임 231ms
5+
* [생각]
6+
* for문으로 알파벳, 숫자를 제외한 특수문자들을 제거한 후에 투 포인터 알고리즘으로 풀이하자.
7+
*/
8+
public boolean isPalindrome(String s) {
9+
StringBuilder sb = new StringBuilder();
10+
for (char c : s.toCharArray()) {
11+
if (Character.isDigit(c)) {
12+
sb.append(c);
13+
}
14+
if (Character.isAlphabetic(c)) {
15+
sb.append(Character.toLowerCase(c));
16+
}
17+
}
18+
19+
int left = 0;
20+
int right = sb.toString().length() - 1;
21+
22+
while (left <= right) {
23+
if (sb.toString().charAt(left) != sb.toString().charAt(right)) {
24+
return false;
25+
}
26+
left++;
27+
right--;
28+
}
29+
return true;
30+
}
31+
32+
/**
33+
* 런타임 7ms
34+
* [생각]
35+
* 굳이 투 포인터로? 이미 활용중인 StringBuilder를 reverse()본과 원본을 비교하면 탐색 필요없다.
36+
* 또한 " " 케이스는 사전에 리턴처리한다.
37+
*/
38+
public boolean isPalindrome2(String s) {
39+
if (s.equals(" "))
40+
return true;
41+
42+
StringBuilder sb = new StringBuilder();
43+
for (char c : s.toCharArray()) {
44+
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || Character.isDigit(c)) {
45+
sb.append(Character.toLowerCase(c));
46+
}
47+
}
48+
return sb.toString().equals(sb.reverse().toString());
49+
}
50+
}

0 commit comments

Comments
 (0)