Skip to content

Commit e09e898

Browse files
author
jinvicky
committed
longest-consecutive 복습 및 주석 갱신
1 parent c580d4b commit e09e898

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

longest-consecutive-sequence/jinvicky.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
import java.util.HashSet;
22
import java.util.Set;
33

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+
*/
826
class Solution {
927
public int longestConsecutive(int[] nums) {
1028
Set<Integer> set = new HashSet<>();
@@ -26,7 +44,6 @@ public int longestConsecutive(int[] nums) {
2644
maxLength = Math.max(length, maxLength);
2745
}
2846
}
29-
3047
return maxLength;
3148
}
3249
}

0 commit comments

Comments
 (0)