Skip to content

Commit 0ba6272

Browse files
authored
Merge pull request #1681 from jinvicky/main
[jinvicky] WEEK 01 solutions
2 parents be68f4a + 842cba9 commit 0ba6272

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

contains-duplicate/jinvicky.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public boolean containsDuplicate(int[] nums) {
5+
Set<Integer> set = new HashSet<>();
6+
for (int num : nums) {
7+
if (!set.add(num)) return true;
8+
}
9+
return false;
10+
}
11+
}

house-robber/jinvicky.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//dp[0] -> 1번째 집 털이 수완으로 초기화
2+
//dp[1] -> -2집 털이+지금집 털이가 -1집 털이보다 수완이 좋다. = -2집 털이(0)+지금집 털이 = 7
3+
//dp[2] -> -2집 털이+지금집 털이가 -1집 털이보다 수완이 좋다. = -2집 털이+지금집 털이 = 11
4+
//dp[3] -> -2집 털이+지금집 털이가 -1집 털이보다 수완이 좋다. = -2집 털이+지금집 털이 = 11 (>10)
5+
//dp[4] -> -2집 털이+지금집 털이가 -1집 털이보다 수완이 좋다. = -2집 털이+지금집 털이 = 12 (>10)
6+
class Solution {
7+
public int rob(int[] nums) {
8+
int[] dp = new int[nums.length];
9+
dp[0] = nums[0];
10+
11+
for (int i = 1; i < nums.length; i++) {
12+
int prev2AndNowRob = (i - 2 < 0 ? 0 : dp[i - 2]) + nums[i];
13+
int prev1Rob = dp[i - 1];
14+
15+
dp[i] = Math.max(prev2AndNowRob, prev1Rob);
16+
}
17+
return dp[nums.length - 1];
18+
}
19+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import java.util.HashSet;
2+
import java.util.Set;
3+
4+
// 연속적인 숫자의 길이를 구하는 것이기 때문에 이전, 다음 수가 집합의 일부인지를 파악해야 한다.
5+
// map, set 자료구조를 사용하면 조회 성능을 O(1)로 높일 수 있다.
6+
// 어려웠던 점은 연속적인 숫자의 start가 되냐 여부 조건을 떠올리는 것이었다. while문이 약해서 length++하는 로직이 힘들었다.
7+
// 문제의 조건은 배열 내에서의 연속적인 숫자의 길이이기 때문에 while을 사용해도 성능 이슈 걱정할 필요가 없었다.
8+
class Solution {
9+
public int longestConsecutive(int[] nums) {
10+
Set<Integer> set = new HashSet<>();
11+
12+
for (int n : nums) {
13+
set.add(n);
14+
}
15+
16+
int maxLength = 0;
17+
18+
for (int n : nums) {
19+
if (!set.contains(n - 1)) { // 내 이전 숫자가 집합에 없다 == 내가 최소 숫자다.
20+
int length = 1;
21+
22+
while (set.contains(n + length)) {
23+
length++;
24+
}
25+
26+
maxLength = Math.max(length, maxLength);
27+
}
28+
}
29+
30+
return maxLength;
31+
}
32+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
import java.util.PriorityQueue;
4+
5+
class Solution {
6+
public int[] topKFrequent(int[] nums, int k) {
7+
// [풀이]
8+
// 1. <숫자: 빈도수>를 저장하는 HashMap과 [빈도수, 숫자]를 저장하는 PriorityQueue를 선언한다.
9+
// 2. HashMap에 숫자별로 빈도수를 함께 저장해서 해시테이블을 만든다.
10+
// [우선순위 큐에 사용된 자료구조]
11+
// 1. 별도 클래스를 선언
12+
// 2. 요구사항 자료형 배열을 선언한다.
13+
// 처음에는 별도 클래스를 선언했다가 값이 2개이며 알고리즘 로직 자체가 어려워서 int[] 구조로 풀이했다.
14+
// (주로 알고리즘이 어려우면 가독성이 나쁘더라도 자료구조를 단순화하는 습관이 있다)
15+
// [어려웠던 점]
16+
// 1. 우선순위 큐는 매번 요소가 추가될 때마다 내부 정렬을 수행하기 때문에 연산을 수행하면서 k개를 유지해야 한다.
17+
// 또한 기존 [빈도수, 숫자]를 버려야만 올바른 답을 도출할 수 있었다.
18+
// 2. [숫자, 빈도수]로 저장하는 것만 생각했더니 내부 정렬을 어떻게 하지 못해서 굉장히 고민했다. 정답은 반대였다.
19+
20+
int[] answer = new int[k];
21+
22+
Map<Integer, Integer> map = new HashMap<>();
23+
for (int n : nums) {
24+
map.put(n, map.getOrDefault(n, 0) + 1);
25+
}
26+
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);
27+
28+
for (int key : map.keySet()) {
29+
pq.add(new int[]{map.get(key), key});
30+
if (pq.size() > k) {
31+
pq.poll();
32+
}
33+
}
34+
35+
for (int i = 0; i < k; i++) {
36+
if (!pq.isEmpty()) {
37+
answer[i] = pq.poll()[1];
38+
}
39+
}
40+
return answer;
41+
}
42+
}

two-sum/jinvicky.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
/**
5+
* 본래 brute force로 이중 for문으로 풀었다가 map으로 최적화.
6+
*/
7+
class Solution {
8+
9+
public int[] twoSumByBruteForce(int[] nums, int target) {
10+
for (int i = 0; i < nums.length; i++) {
11+
for (int j = i + 1; j < nums.length; j++) {
12+
if (nums[i] + nums[j] == target) {
13+
return new int[]{i, j};
14+
}
15+
}
16+
}
17+
return new int[2];
18+
}
19+
20+
public int[] twoSum(int[] nums, int target) {
21+
Map<Integer, Integer> numberMap = new HashMap<>();
22+
23+
for (int i = 0; i < nums.length; i++) {
24+
int required = target - nums[i];
25+
Integer index = numberMap.get(required);
26+
27+
if (index != null) {
28+
return new int[]{index, i};
29+
}
30+
31+
numberMap.put(nums[i], i);
32+
}
33+
34+
return new int[2];
35+
}
36+
}

0 commit comments

Comments
 (0)