bgb10   1년 전

저도 이분탐색 풀이를 떠올려서 BST를 사용해서 풀었는데요, 바로 시간초과가 뜹니다.

아마 BST가 느려서 시간초과가 난 것 같은데, 

1. 혹시 해당 풀이가 '시간을 제외하고는' 맞는 풀이인지,

2. 똑같이 이분탐색을 사용한 풀이인데 직접 구현한 이분탐색은 되고, set 을 사용한 이분탐색을 하면 안될 때가 있는데,

실전에서는 어느 기준을 두고 둘 중 하나를 선택해야 하는지.

에 대해 조언해주셨으면 합니다. 감사합니다!

zenith82114   1년 전

아니요, 이 코드는 정답이 아닙니다. 아래에 반례가 있습니다.

7이 들어올 때, 실제로는 [1,2,4,5,7]로 5개짜리를 만들 수 있는데

앞에 있는 (6,2) pair를 보고 (7,3) pair를 만들어 버립니다.

여담으로, lower_bound 함수는 헤더에도 있지만 std::set의 멤버함수 중에도 있습니다.

전자보다 후자가 훨씬 빠르고, 이유는 한 줄로 말하자면 std::set이 random-access iterator가 아니기 때문입니다.

(X) auto it = lower_bound(BST.begin(), BST.end(), make_pair(x, 0));

(O) auto it = BST.lower_bound(make_pair(x, 0));

zenith82114   1년 전

(수정) 헤더에도 있지만 -> <algorithm> 헤더에도 있지만

bgb10   1년 전

답변 정말 감사합니다. 풀이가 틀린 것도 알았고, lower_bound 를 저렇게 사용하면 안된다는 것도 배웠네요!

댓글을 작성하려면 로그인해야 합니다.