File tree Expand file tree Collapse file tree 5 files changed +140
-0
lines changed
longest-consecutive-sequence Expand file tree Collapse file tree 5 files changed +140
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments