Skip to content

Commit 2cb19a5

Browse files
authored
Merge pull request #1979 from haxr369/main
[haxr369] WEEK 01 solutions
2 parents 5fd70b9 + 73ac83a commit 2cb19a5

File tree

5 files changed

+212
-0
lines changed

5 files changed

+212
-0
lines changed

contains-duplicate/haxr369.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import java.util.HashSet;
2+
import java.util.Set;
3+
4+
class Solution {
5+
public boolean containsDuplicate(int[] nums) {
6+
/**
7+
* Runtime: 14 ms (Beats 62.49%)
8+
* Space Complexity: O(N)
9+
* > nums 배열 길이 N. 중복하지 않은 모든 요소가 Set에 들어가기 때문에 O(N)
10+
* Time Complexity: O(N) ~ O(NlogN)
11+
* - 크기 N 배열 조회에 O(N)
12+
* - Set에 숫자 중복 체크 O(1)
13+
* - 단, 최악에 경우로 중복 체크에 O(logN)이 발생 가능
14+
* > O(N) * O(1) ~ O(NlogN)
15+
* Memory: 93.28 (Beats 6.24%)
16+
*/
17+
Set<Integer> st = new HashSet<>();
18+
for (int n : nums) {
19+
if (st.contains(n)) {
20+
return true;
21+
}
22+
st.add(n);
23+
}
24+
return false;
25+
26+
}
27+
}

house-robber/haxr369.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
/**
3+
* 인전합 두 집을 털면 안됨
4+
*
5+
* i번째 집에서 할 수 있는 행위는? 2가지.
6+
* 털거나:
7+
* 털면 i-1번째 집은 안 털어야함, i-2번째 집은 털어도 괜찮겠지?
8+
* Money_A = nums[i] + DP[i-2]
9+
* 털지 않거나:
10+
* i번째 집을 안 털면, i-1번째집은 털어도 괜찮다.
11+
* Money_B = DP[i-1]
12+
* dp[i]를 i번째 집 앞에서 들고 있을 최대 금액이라고 할 때,
13+
* dp[i] = MAX(Money_A, Money_B)
14+
* 문제는 dp[nums.length-1]을 구하기
15+
*/
16+
public int rob(int[] nums) {
17+
/**
18+
* 12분 소요.
19+
* Runtime: 0 ms (Beats 100%)
20+
* Memory: 42.74 MB (Beats 6.31%)
21+
* Space Complexity: O(N)
22+
* - nums 저장 => O(N)
23+
* - 최대 금액 저장 배열 => O(N)
24+
* > O(2N) ~= O(N)
25+
* Time Complexity: O(N)
26+
* - nums 처음부터 끝까지 조회하며 dp 저장. => O(N)
27+
* > O(N)
28+
*/
29+
int[] dp = new int[nums.length];
30+
31+
dp[0] = nums[0];
32+
if (nums.length > 1) {
33+
dp[1] = Integer.max(dp[0], nums[1]);
34+
}
35+
for (int i = 2; i < nums.length; i++) {
36+
// 터는 경우와 안터는 경우 중 최대 값.
37+
dp[i] = Integer.max(dp[i - 2] + nums[i], dp[i - 1]);
38+
}
39+
return dp[nums.length - 1];
40+
}
41+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
/**
5+
* 13분 소요.
6+
* Runtime: 23 ms (Beats 80.31%)
7+
* Memory: 77.33 (Beats 9.66%)
8+
* Space Complexity: O(N)
9+
* - 원소 배열 정렬은 듀얼 피봇 sort => O(logN)
10+
* > O(N) + O(logN) ~= O(N)
11+
* Time Complexity: O(NlogN)
12+
* - 듀얼 피봇 sort를 이용한 정렬 => O(NlogN)
13+
* - 배열을 처음부터 끝까지 조회, 이전 값과 비교 => O(N)*O(1)
14+
* > O(NlogN) + O(N) ~= O(NlogN)
15+
*/
16+
public int longestConsecutive(int[] nums) {
17+
Arrays.sort(nums);
18+
19+
if (nums.length == 0) {
20+
return 0;
21+
}
22+
int ans = 1;
23+
int seqLgth = 1;
24+
for (int i = 1; i < nums.length; i++) {
25+
// 바로 연결되는 경우는 바로 이전 요소 보다 1이 더 커야함.
26+
if (nums[i - 1] < nums[i] && nums[i] - nums[i - 1] == 1) {
27+
nums[i - 1] = nums[i];
28+
seqLgth++;
29+
ans = Integer.max(ans, seqLgth); // 항상 ans 업데이트 하기
30+
} else if (nums[i - 1] < nums[i] && nums[i] - nums[i - 1] > 1) {
31+
// 새로운 연결로 들어가기
32+
seqLgth = 1;
33+
}
34+
}
35+
return ans;
36+
}
37+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import java.util.HashMap;
2+
import java.util.List;
3+
import java.util.Map;
4+
import java.util.stream.Collectors;
5+
6+
class Solution {
7+
/**
8+
* 30분 38초 소요.
9+
* nums에서 가장 자주 등장하는 k개 숫자 리턴하기
10+
* Map에 요소:등장수로 관리하기
11+
* Stream으로 등장수 기준으로 내림차순 정렬 후 k개만 리스트로 만들어서 출력한다.
12+
*
13+
* Java의 Stream과 Comparator 사용법을 익혀야함.
14+
* Comparable도 몰랐던 부분.
15+
*/
16+
public int[] topKFrequent(int[] nums, int k) {
17+
/**
18+
* Runtime: 21 ms (Beats 6.30%)
19+
* Memory: 47.42 (Beats 83.73%)
20+
* Space Complexity: O(N)
21+
* - HashMap 공간복잡도 => O(N)
22+
* - sort에서 tim sort 사용 => O(N)
23+
* > O(N)
24+
* Time Complexity: O(NlogN)
25+
* - tim sort를 이용한 정렬 => O(NlogN)
26+
* > O(N) + O(NlogN) + O(N) ~= O(NlogN)
27+
*/
28+
29+
Map<Integer, Integer> mp = new HashMap<>();
30+
for (int n : nums) {
31+
if (mp.containsKey(n)) {
32+
mp.put(n, mp.get(n) + 1);
33+
} else {
34+
mp.put(n, 1);
35+
}
36+
}
37+
List<Integer> li = mp.entrySet().stream()
38+
// 값을 기준으로 내림차순 정렬
39+
.sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
40+
.limit(k)
41+
.map(Map.Entry::getKey)
42+
.collect(Collectors.toList());
43+
44+
int[] ans = new int[li.size()];
45+
for (int i = 0; i < li.size(); i++) {
46+
ans[i] = li.get(i);
47+
}
48+
return ans;
49+
}
50+
}

two-sum/haxr369.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
/**
5+
* 합해서 target이 되는 두 수의 인덱스를 배열에 넣어서 return.
6+
* 1. nums 정렬하기
7+
* 2. smlNumbIdx(초기 0), lrgNumbIdx(초기 nums.length - 1)에 인덱스를 저장
8+
* 3. smlNumb와 lrgNumb를 합해서 tmp를 계산
9+
* 4. tmp와 target을 비교.
10+
* 4.1. tmp < target인 경우
11+
* smlNumbIdx에 1 더하기
12+
* 4.2. tmp > target인 경우
13+
* lrgNumbIdx에 1 빼기
14+
* 4.3. tmp = target인 경우
15+
* smlNumbIdx와 lrgNumbIdx 배열 return
16+
*/
17+
public int[] twoSum(int[] nums, int target) {
18+
/**
19+
* Runtime: 8 ms (Beats 47.90%)
20+
* Memory: 46.70 (Beats 5.05%)
21+
* Space Complexity: O(N)
22+
* > Arrays.sort의 객체 타입은 tim sort를 이용하기 때문에 O(N)을 가짐
23+
* Time Complexity: O(NlogN)
24+
* - 크기 Nx2 배열에 값과 인덱스를 넣기 => O(N)
25+
* - tim sort를 이용한 정렬 => O(NlogN)
26+
* - N회 for문으로 정답 인덱스 찾기 => O(N)
27+
* > O(N) + O(NlogN) + O(N) ~= O(NlogN)
28+
*/
29+
int[][] arr = new int[nums.length][2];
30+
for (int i = 0; i < nums.length; i++) {
31+
arr[i][0] = nums[i];
32+
arr[i][1] = i;
33+
}
34+
Arrays.sort(arr, (a, b) -> {
35+
if (a[0] != b[0])
36+
return Integer.compare(a[0], b[0]);
37+
return 1; // 동일하면 상관 없음.
38+
});
39+
40+
int smlNumbIdx = 0;
41+
int lrgNumbIdx = nums.length - 1;
42+
for (int i = 0; i < arr.length; i++) {
43+
if (arr[smlNumbIdx][0] + arr[lrgNumbIdx][0] == target) {
44+
int[] ans = { arr[smlNumbIdx][1], arr[lrgNumbIdx][1] };
45+
return ans;
46+
} else if (arr[smlNumbIdx][0] + arr[lrgNumbIdx][0] < target) {
47+
smlNumbIdx++;
48+
} else {
49+
lrgNumbIdx--;
50+
}
51+
}
52+
53+
// 문제는 없지만, 예외케이스가 발생할 수 있으니 더미 데이터 출력
54+
int[] ans = { 0, nums.length };
55+
return ans;
56+
}
57+
}

0 commit comments

Comments
 (0)