Skip to content

Commit 9c84199

Browse files
authored
Merge pull request #1280 from eunhwa99/main
[eunhwa99] Week 03 Solutions
2 parents c7eef52 + 14c1f05 commit 9c84199

File tree

5 files changed

+132
-31
lines changed

5 files changed

+132
-31
lines changed

combination-sum/eunhwa99.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,28 @@ private void backtrack(int[] candidates, int target, int start, List<Integer> cu
3030
}
3131
}
3232
}
33+
34+
// 시간 복잡도: O(2^(target)) - 각 후보 숫자가 target을 만드는 데에 기여할 수도 있고 안 할 수도 있음
35+
// 공간 복잡도: O(k * t) - k는 가능한 조합의 수, t는 각 조합의 크기
36+
class newSolution{
37+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
38+
List<List<Integer>> result = new ArrayList<>();
39+
backtrack(result, new ArrayList<>(), candidates, target, 0);
40+
return result;
41+
}
42+
43+
private void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] candidates, int remain, int start) {
44+
if (remain < 0) return; // 넘치면 종료
45+
if (remain == 0) {
46+
result.add(new ArrayList<>(tempList)); // 정답 조합 발견
47+
return;
48+
}
49+
50+
for (int i = start; i < candidates.length; i++) {
51+
tempList.add(candidates[i]); // 후보 추가
52+
backtrack(result, tempList, candidates, remain - candidates[i], i); // **같은 수를 다시 사용할 수 있으므로 i**
53+
tempList.removeLast(); // 백트래킹 (되돌리기)
54+
}
55+
}
56+
}
57+

decode-ways/eunhwa99.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,35 @@ private boolean checkRange(char left, char right) {
4747
return (num >= 10 && num <= 26);
4848
}
4949
}
50+
51+
// 시간 복잡도: O(n) - 문자열 길이 n에 비례
52+
// 공간 복잡도: O(n) - dp 배열 사용
53+
class newSolution {
54+
public int numDecodings(String s) {
55+
int n = s.length();
56+
if (n == 0 || s.charAt(0) == '0') return 0;
57+
58+
int[] dp = new int[n + 1];
59+
dp[0] = 1; // 빈 문자열은 한 가지 방법
60+
dp[1] = 1; // 첫 문자가 0이 아니면 한 가지 방법
61+
62+
for (int i = 2; i <= n; i++) {
63+
char one = s.charAt(i - 1); // 한 자리 숫자
64+
char twoPrev = s.charAt(i - 2); // 두 자리 숫자의 앞자리
65+
66+
// 1칸 이동 가능 (0은 이동 불가)
67+
if (one != '0') {
68+
dp[i] += dp[i - 1];
69+
}
70+
71+
// 2칸 이동 가능한지 확인 (10~26)
72+
int num = (twoPrev - '0') * 10 + (one - '0');
73+
if (num >= 10 && num <= 26) {
74+
dp[i] += dp[i - 2];
75+
}
76+
}
77+
78+
return dp[n];
79+
}
80+
}
81+

maximum-subarray/eunhwa99.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
// 시간 복잡도: DP -> O(N)
2-
// 공간 복잡도: nums 배열 크기 - O(N)
31

2+
// 이전 솔루션과 동일
3+
// 시간 복잡도: O(n) - n은 주어진 배열의 길이
4+
// 공간 복잡도: O(1) - 상수 공간 사용
45
class Solution {
5-
public int maxSubArray(int[] nums) {
6-
int currentSum = nums[0];
7-
int maxSum = currentSum;
8-
for (int i = 1; i < nums.length; ++i) {
9-
currentSum = Math.max(currentSum + nums[i], nums[i]);
10-
maxSum = Math.max(maxSum, currentSum);
11-
}
12-
13-
return maxSum;
6+
7+
public int maxSubArray(int[] nums) {
8+
int currentSum = nums[0];
9+
int maxSum = currentSum;
10+
for (int i = 1; i < nums.length; ++i) {
11+
currentSum = Math.max(currentSum + nums[i], nums[i]);
12+
maxSum = Math.max(maxSum, currentSum);
1413
}
14+
15+
return maxSum;
16+
}
1517
}
18+

number-of-1-bits/eunhwa99.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// 시간 복잡도 O(log n) - n은 주어진 정수
2+
// 공간 복잡도 O(1) - 상수 공간 사용
3+
class Solution{
4+
public int hammingWeight(int n) {
5+
int count = 0;
6+
while (n != 0) {
7+
count += (n & 1); // 마지막 비트가 1인지 확인
8+
n >>= 1; // 오른쪽으로 비트 이동
9+
}
10+
return count;
11+
}
12+
}
13+

valid-palindrome/eunhwa99.java

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,51 @@
11
class Solution {
2-
public boolean isPalindrome(String s) {
3-
StringBuilder str = new StringBuilder();
4-
5-
for (int i = 0; i < s.length(); i++) {
6-
char c = s.charAt(i);
7-
if (Character.isLetterOrDigit(c)) {
8-
str.append(Character.toLowerCase(c));
9-
}
10-
}
11-
12-
int left = 0, right = str.length() - 1;
13-
while (left < right) {
14-
if (str.charAt(left) != str.charAt(right)) {
15-
return false;
16-
}
17-
left++;
18-
right--;
19-
}
20-
21-
return true;
2+
3+
public boolean isPalindrome(String s) {
4+
StringBuilder str = new StringBuilder();
5+
6+
for (int i = 0; i < s.length(); i++) {
7+
char c = s.charAt(i);
8+
if (Character.isLetterOrDigit(c)) {
9+
str.append(Character.toLowerCase(c));
10+
}
2211
}
12+
13+
int left = 0, right = str.length() - 1;
14+
while (left < right) {
15+
if (str.charAt(left) != str.charAt(right)) {
16+
return false;
17+
}
18+
left++;
19+
right--;
20+
}
21+
22+
return true;
23+
}
24+
}
25+
26+
// 시간 복잡도 O(n) - 문자열 길이 n
27+
// 공간 복잡도 O(1)
28+
class newSolution {
29+
public boolean isPalindrome(String s) {
30+
int left = 0, right = s.length() - 1;
31+
32+
while (left < right) {
33+
// 알파벳/숫자가 아닌 경우 skip
34+
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
35+
left++;
36+
}
37+
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
38+
right--;
39+
}
40+
41+
// 소문자로 비교
42+
if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
43+
return false;
44+
}
45+
46+
left++;
47+
right--;
48+
}
49+
return true;
50+
}
2351
}

0 commit comments

Comments
 (0)