문제:
만약 당신이 약속의 리스트가 있는데 ( 각 약속 시간들은 시작 시간과 끝나는 시간이있고 각 시간들은 겹쳐있을수도 아닐 수도 있다)
당신은 어떻게 효율적으로 각 약속시간들이 어느 약속시간과 겹쳐있는지 찾을것인가. 각 시간들은 정렬되있지 않은 상태다.
약속 하나가 매우 길수도 있다는것을 명심하라.
해결:
1. i번째 약속의 시간이 a_i ~ b_i 라고 한다면, 얘네들을 (a_i, i, start) / (b_i, i, end)로 쪼갬
2. 쪼갠 튜플들 (2N 개)을 시간 기준으로 정렬함. 시간이 동일할 경우 end가 start 보다 먼저오게 정렬. (중간의 i는 상관 없음)
3. 앞에서부터 튜플을 하나씩 보면서 현재 진행중인 약속을 저장해놓음 (hashset이나 N개짜리 bool array면 될듯)
3-1. end를 만나면 진행중인 약속에서 제거
3-2. start를 만나면 진행중인 약속들과 겹치니까 이를 적음. 그리고 진행중인 약속에 추가
이러면 정렬에 O(N lg N), 중간 루프에 O(N) 이면 해결될듯
i번째 줄에는 약속시간 i와 겹쳐 있는 모든 약속시간의 번호를 출력한다. 처럼 나오면 결국 출력에만 O(N^2), 따라서 3-2에서 "이를 적음." 만으로도 O(N^2) 아닌가?
물론 저 위의 알고리즘은 적는게 O(1)일때만 가능함
애초에 O(N^2)이라서 Naive하게 짜도 asymptotic한 시간 복잡도가 안변함
ㅇㅎ
이렇게하면 {1,10} { 2,11 } { 3,12 } 일 때 1,2,3,10,11,12 되는데 두번째나 세번째 약속 갯수가 제대로 안나오지 않나?
제대로 나옴. 약속을 추가할때 양쪽으로 추가해야함
3,3,3 이 되야하는데 3,2,1 이렇게 가잖어
그리고 2,2,2 가 나와야 함
(1,10) (2,4 ) (5,7 ) ( 8,9 ) 면 안나오지 않음? - dc App
되는구나 ㅈㅅ ㅎㅎ; - dc App