1
1
import java .util .HashSet ;
2
2
import java .util .Set ;
3
3
4
- // 연속적인 숫자의 길이를 구하는 것이기 때문에 이전, 다음 수가 집합의 일부인지를 파악해야 한다.
5
- // map, set 자료구조를 사용하면 조회 성능을 O(1)로 높일 수 있다.
6
- // 어려웠던 점은 연속적인 숫자의 start가 되냐 여부 조건을 떠올리는 것이었다. while문이 약해서 length++하는 로직이 힘들었다.
7
- // 문제의 조건은 배열 내에서의 연속적인 숫자의 길이이기 때문에 while을 사용해도 성능 이슈 걱정할 필요가 없었다.
4
+ /**
5
+ * 왜 set을 썼을까? 내가 원하는 "특정 조건"을 제시했을 때 그 숫자를 O(1)으로 조회할 수 있기 때문이다.
6
+ * set이 줄 것을 알기에 나는 조건을 설계하는 데만 집중한다.
7
+ * 1. 내가 포함된 연속된 시퀀스가 있는가? -> set.contains(n-1)
8
+ * 2. 내가 새로운 시퀀스의 start인가? -> !set.contains(n-1)
9
+ * <p>
10
+ * 여기서 가장 긴 길이를 구한다 == Math.max(기존 최대길이, 현재 계산한 최대길이) -> 자동으로 Math.max()가 떠오른다.
11
+ * 현재 최대길이는 본인을 포함한 1부터 시작한다.
12
+ * [길이를 계산할 때 항상 해야 할까???] -> 아니다!
13
+ * 왜? 이미 내가 포함된 연속된 시퀀스는 maxLength를 비교하는 과정을 거쳤는데 굳이 또?
14
+ * <p>
15
+ * 배움: 일단 계산을 떠올린다. -> 그리고 그 계산을 언제(if) 수행할 것인지 조건을 설정한다. (항상 해도 되는가? 중복되지는 않는가?)
16
+ * <p>
17
+ * [성능에 대한 잘못된 생각]
18
+ * O(n)이라면 꼭 for문 1번으로 해결해야 한다는 잘못된 생각을 갖고 있었다.
19
+ * 첫 번째 루프가 O(n), 두 번째 루프가 O(n)이고, 두 개를 합치면 O(n + n)입니다.
20
+ * 시간 복잡도 계산에서 상수 계수는 무시되므로 결국 O(n)으로 표기한다.
21
+ * <p>
22
+ * [후기]
23
+ * 처음에는 어 기존이랑... 지금이랑 별도 배열로 체크? 그런데 배열의 개수가 어디까지 늘어나지...?
24
+ * 항상 기억할 점은 최대 길이, 최소 길이와 같은 문제는 결과가 중요하지 어느 숫자로 이루어져있는지 알 필요가 없다.
25
+ */
8
26
class Solution {
9
27
public int longestConsecutive (int [] nums ) {
10
28
Set <Integer > set = new HashSet <>();
@@ -26,7 +44,6 @@ public int longestConsecutive(int[] nums) {
26
44
maxLength = Math .max (length , maxLength );
27
45
}
28
46
}
29
-
30
47
return maxLength ;
31
48
}
32
49
}
0 commit comments