Skip to content

Commit f0c198f

Browse files
authored
Merge pull request #795 from imsosleepy/main
[ackku] Week 3
2 parents 08a3376 + 08a41dd commit f0c198f

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed

combination-sum/imsosleepy.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// 처음엔 dp라 생각했는데, backtracking인걸 알아차리자마자 풀 수 있었음
2+
// 중간 결과를 계속 전달하는게 팁
3+
class Solution {
4+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
5+
List<List<Integer>> result = new ArrayList<>();
6+
backtracking(candidates, target, 0, new ArrayList<>(), result);
7+
return result;
8+
}
9+
10+
private void backtracking(int[] candidates, int target, int start, List<Integer> tmp, List<List<Integer>> result) {
11+
if (target < 0) {
12+
return;
13+
}
14+
15+
if (target == 0) {
16+
result.add(new ArrayList<>(tmp));
17+
return;
18+
}
19+
20+
for (int i = start; i < candidates.length; i++) {
21+
tmp.add(candidates[i]);
22+
backtracking(candidates, target - candidates[i], i, tmp, result);
23+
tmp.remove(tmp.size() - 1);
24+
}
25+
}
26+
}

maximum-subarray/imsosleepy.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// subarray = "연속된 값"의 합을 요구 함 그래서 간단한 풀이가 가능하다.
2+
// 이전 인덱스나 값들을 기억할 필요가 없어서 누적합 느낌으로 풀 수 있다.
3+
// 키포인트는 이전까지의 합보다 다음 숫자가 큰 경우의 수가 존재한다는 것
4+
class Solution {
5+
public int maxSubArray(int[] nums) {
6+
int max = nums[0];
7+
int current = nums[0];
8+
9+
for (int i = 1; i < nums.length; i++) {
10+
current = Math.max(nums[i], current + nums[i]);
11+
max = Math.max(max, current);
12+
}
13+
14+
return max;
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
// 누적곱을 이용한 풀이 int 크기를 보장해줘서 int를 사용하면된다.
3+
// O(N)의 시간복잡도가 나온다.
4+
public int[] productExceptSelf(int[] nums) {
5+
int n = nums.length;
6+
int[] result = new int[n];
7+
result[0] = 1;
8+
for (int i = 1; i < n; i++) {
9+
result[i] = result[i - 1] * nums[i - 1];
10+
}
11+
12+
int right = 1;
13+
for (int i = n - 1; i >= 0; i--) {
14+
result[i] = result[i] * right;
15+
right *= nums[i];
16+
}
17+
18+
return result;
19+
}
20+
}

reverse-bits/imsosleepy.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// 스택으로 풀기보다 비트연산자로 풀이
2+
// 스택을 사용할 때는 32자리의 불필요한 공간이 생긴다.
3+
public class Solution {
4+
public int reverseBits(int n) {
5+
// n 이 십진수로 들어온다.(중요)
6+
int result = 0;
7+
for (int i = 0; i < 32; i++) {
8+
// 마지막 비트 확인
9+
// 홀수: 마지막 비트가 1 (n & 1 == 1)
10+
// 짝수: 마지막 비트가 0 (n & 1 == 0)
11+
int bit = n & 1;
12+
// result를 왼쪽으로 1비트 이동하고, 추출한 비트를 추가
13+
// - result의 마지막 비트를 비우고 (<< 1)
14+
// - OR 연산(|)으로 추출한 비트를 추가
15+
result = (result << 1) | bit;
16+
17+
// n을 오른쪽으로 1비트 이동하여 다음 비트를 준비
18+
// - n의 마지막 비트를 버리고, 상위 비트를 아래로 이동
19+
n >>= 1;
20+
}
21+
return result;
22+
}
23+
}

two-sum/imsosleepy.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// hashmap 조회 방식은 O(N)
2+
// 3ms
3+
public int[] twoSum(int[] nums, int target) {
4+
Map<Integer, Integer> map = new HashMap<>();
5+
for (int i = 0; i < nums.length; i++) {
6+
int complement = target - nums[i];
7+
if (map.containsKey(complement)) {
8+
return new int[] { map.get(complement), i };
9+
}
10+
map.put(nums[i], i);
11+
}
12+
return null;
13+
}
14+
15+
// 첫 생각 : 정렬 -> 투포인터
16+
public int[] twoSum1(int[] nums, int target) {
17+
Arrays.sort(nums);
18+
int left = 0;
19+
int right = nums.length-1;
20+
int sum = 0;
21+
while(left < right) {
22+
sum = nums[left] + nums[right];
23+
if(target > sum) {
24+
left++;
25+
}
26+
if(target < sum) {
27+
right--;
28+
}
29+
if(target == sum) {
30+
break;
31+
}
32+
}
33+
return new int[]{left, right};
34+
}
35+
36+
// 투포인터는 O(N)에 충족하지만 정렬이 nlog(n)임
37+
// 9ms
38+
public int[] twoSum2(int[] nums, int target) {
39+
int[][] indexedNums = new int[nums.length][2];
40+
for (int i = 0; i < nums.length; i++) {
41+
indexedNums[i][0] = nums[i];
42+
indexedNums[i][1] = i;
43+
}
44+
45+
Arrays.sort(indexedNums, Comparator.comparingInt(a -> a[0]));
46+
47+
int left = 0, right = nums.length - 1;
48+
while (left < right) {
49+
int sum = indexedNums[left][0] + indexedNums[right][0];
50+
if (sum == target) {
51+
return new int[] { indexedNums[left][1], indexedNums[right][1] };
52+
} else if (sum < target) {
53+
left++;
54+
} else {
55+
right--;
56+
}
57+
}
58+
return new int[]{left, right};
59+
}

0 commit comments

Comments
 (0)