Skip to content

Commit bd679ed

Browse files
Merge pull request #1163 from YoungSeok-Choi/feature/week-1
2 parents 38c03ef + f38c7af commit bd679ed

File tree

5 files changed

+207
-0
lines changed

5 files changed

+207
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
class Solution {
5+
// 시간복잡도 O(n)
6+
public boolean containsDuplicate(int[] nums) {
7+
Map<Integer, Boolean> dupMap = new HashMap<>();
8+
9+
for(int i = 0; i < nums.length; i++) {
10+
if(dupMap.containsKey(nums[i])) {
11+
return true;
12+
}
13+
14+
dupMap.put(nums[i], true);
15+
}
16+
17+
return false;
18+
}
19+
}

house-robber/YoungSeok-Choi.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
// 시간복잡도: O(n)
5+
// TODO: DP 방식으로 풀어보기
6+
class Solution {
7+
public Map<Integer, Integer> robMap = new HashMap<>();
8+
public int rob(int[] nums) {
9+
return dfs(nums, 0);
10+
}
11+
12+
public int dfs(int[] nums, int index) {
13+
if(nums.length == 0) {
14+
return 0;
15+
}
16+
17+
if(index >= nums.length) {
18+
return 0;
19+
}
20+
21+
// 이미 털었던 집이라면, 해
22+
if(robMap.containsKey(index)) {
23+
return robMap.get(index);
24+
}
25+
26+
// 이번 집을 털게되는 경우
27+
int robThis = nums[index] + dfs(nums, index + 2);
28+
29+
// 이번 집을 털지않고 건너뛰는 경우,.
30+
int skipThis = dfs(nums, index + 1);
31+
32+
robMap.put(index, Math.max(robThis, skipThis));
33+
34+
return robMap.get(index);
35+
}
36+
}
37+
38+
// TODO: 비효율적으로 작성한 알고리즘의 동작 방식을 도식화 해서 그려보기.
39+
// NOTE: dfs를 사용한 완전탐색
40+
// 탐색 방식이 매우 비효율적이라, 정답은 맞추지만 N이 커지면 시간초과
41+
// 시간복잡도: O(2^n) + alpha(중복탐색)
42+
class WrongSolution {
43+
public boolean[] visit;
44+
public int mx = -987654321;
45+
public int curSum = 0;
46+
47+
public int rob(int[] nums) {
48+
if(nums.length == 1) {
49+
return nums[0];
50+
}
51+
52+
visit = new boolean[nums.length];
53+
dfs(nums, 0);
54+
dfs(nums, 1);
55+
56+
return mx;
57+
}
58+
59+
public void dfs(int[] arr, int idx) {
60+
int len = arr.length;
61+
int prevIdx = idx - 1;
62+
int nextIdx = idx + 1;
63+
64+
65+
if(idx == 0) {
66+
if(visit[idx]) return;
67+
} else {
68+
if(idx >= len || visit[idx] || visit[prevIdx]) {
69+
return;
70+
}
71+
}
72+
73+
visit[idx] = true;
74+
curSum += arr[idx];
75+
mx = Math.max(mx, curSum);
76+
77+
for(int i = idx; i < len; i++) {
78+
dfs(arr, i);
79+
}
80+
81+
visit[idx] = false;
82+
curSum -= arr[idx];
83+
}
84+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
public int longestConsecutive(int[] nums) {
5+
int curSeq = 1;
6+
int maxSeq = -987654321;
7+
8+
if(nums.length == 0) {
9+
return 0;
10+
}
11+
12+
Arrays.sort(nums);
13+
14+
int cur = nums[0];
15+
for(int i = 1; i < nums.length; i++) {
16+
if(cur == nums[i]) {
17+
continue;
18+
}
19+
20+
if(cur < nums[i] && Math.abs(nums[i] - cur) == 1) {
21+
curSeq++;
22+
cur = nums[i];
23+
continue;
24+
}
25+
26+
// NOTE: 수열의 조건이 깨졌을 때
27+
maxSeq = Math.max(maxSeq, curSeq);
28+
curSeq = 1;
29+
cur = nums[i];
30+
}
31+
32+
return Math.max(maxSeq, curSeq);
33+
}
34+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Solution {
2+
// 시간복잡도: O(3n) -> O(n)
3+
public int[] productExceptSelf(int[] nums) {
4+
5+
int zeroCount = 0;
6+
int[] result = new int[nums.length];
7+
int productExceptZero = 1;
8+
int zeroIdx = 0;
9+
10+
for(int i = 0; i < nums.length; i++) {
11+
if(nums[i] == 0) {
12+
zeroCount++;
13+
}
14+
}
15+
16+
// NOTE: 0이 두개 이상일 때, 모든 배열의 원소가 0;
17+
if(zeroCount >= 2) {
18+
return result;
19+
}
20+
21+
// NOTE: 0이 1개일 때, 0인 index만을 제외하고 모두 곱
22+
if(zeroCount == 1) {
23+
for(int i = 0; i < nums.length; i++) {
24+
if(nums[i] == 0) {
25+
zeroIdx = i;
26+
continue;
27+
}
28+
productExceptZero *= nums[i];
29+
}
30+
31+
result[zeroIdx] = productExceptZero;
32+
return result;
33+
}
34+
35+
// NOTE: 0이 없을 때 모든수를 곱한 뒤 idx를 나누기.
36+
for(int i = 0; i < nums.length; i++) {
37+
productExceptZero *= nums[i];
38+
}
39+
40+
for(int i = 0; i < nums.length; i++) {
41+
int copy = productExceptZero;
42+
result[i] = copy / nums[i];
43+
}
44+
45+
return result;
46+
}
47+
}

two-sum/YoungSeok-Choi.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// time complexity: O(n);
2+
// 특정 nums[i] 가 target이 되기위한 보수 (target - nums[i])를 candidate Map에서 찾으면 종료
3+
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
class Solution {
8+
public int[] twoSum(int[] nums, int target) {
9+
Map<Integer, Integer> candidate = new HashMap<>();
10+
11+
for(int i = 0; i < nums.length; i++) {
12+
13+
int diff = target - nums[i];
14+
15+
if(candidate.containsKey(diff)) {
16+
return new int[] { candidate.get(diff), i };
17+
}
18+
19+
candidate.put(nums[i], i);
20+
}
21+
return new int[0];
22+
}
23+
}

0 commit comments

Comments
 (0)