2143번 - 두 배열의 합
제가 구현한 lower boind랑 upperbound로 값을 찾을시 틀렸다고 뜹니다.... 저거를 그냥 라이브러리에 있는 lower upper을 쓰면 맞다고 뜨는거 보면 이진탐색 에 문제가 있느거 같은데 못찾겠어요ㅠㅠ
https://www.cplusplus.com/refe...
라이브러리에 있는 upper_bound의 return을 확인해보시면 좋을 것 같습니다.
라이브러리의 함수처럼 동작하려면 end를 B.size()로 초기화해야 할 것 같습니다.
B.size()로 초기화 하면 잘못된 인덱스에 접근하지 않나요..? 보통 이진탐색 문제들 다 저렇게 해서 맞았었는데
잘못된 이유를 알수 있을까여?ㅠㅠ
얼핏 보면 잘못된 인덱스에 접근할 것처럼 보이지만 항상 middle<end이므로 실제로 B[end]에 접근할 일은 없습니다.
line73에서 upper과 lower의 차=target의 개수로 생각하고 푸신 것으로 보이는데, std::lower_bound와 std::upper_bound로는 아무 문제가 없지만 직접 구현된 upper에서는 다음과 같은 반례가 생길 수 있습니다.
let B={1,2,3,4,5},
lower(5)=4
upper(5)=4
아 !! std::upper_bound가 제가 그동안 알고 있던거랑 많이 달랐네여. 감사합니다!
댓글을 작성하려면 로그인해야 합니다.
wistlin47 2년 전
제가 구현한 lower boind랑 upperbound로 값을 찾을시 틀렸다고 뜹니다.... 저거를 그냥 라이브러리에 있는 lower upper을 쓰면 맞다고 뜨는거 보면 이진탐색 에 문제가 있느거 같은데 못찾겠어요ㅠㅠ