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