2016년 11월 17일 목요일

BOJ 13702 이상한 술집을 풀다가...

이 문제는 이분 탐색으로 풀 수 있는 문제이다.
이분 탐색으로 나눠줄 수 있는 막걸리 용량을 정해보면서 검사하고 최대가 되도록 조절해 나가면 된다.

그런데 이분 탐색을 할 때, 헷갈리는 것이, l, r중 어느 것에 정답이 들어가냐이다.
그냥 ans 변수를 따로 쓰면 쉽긴하지만, 이분 탐색을 좀 더 이해하고 싶어서(?) l, r중에 어디에 정답이 들어갈지 생각해보는 중이다.

이번에 구현할 때는 생각해보니 r에 들어가서 r을 출력했는데,

예전에 다른 문제를 풀 때는 l에 들어가는 경우가 많았는데.. 그렇다면 l에 정답이 들어가게 하려면 어떻게 해야할까? 다른 고수분의 코드를 보고 깨달은 것인데, 여러 방식이 있겠지만,
check(mid)>=k인 경우 mid가 정답일 수도 있으므로 l=mid+1을 할 게 아니라, l=mid를 해주면 된다. else에 해당하는 check(mid)<k인 경우는 mid가 답이 될 수 없으니 r=mid-1을 해줘야 한다. 그런데 이렇게 할 경우 무한루프에 빠질 수 있다. while(l<=r)이기 때문이다.
l=3, r=5이고 정답이 4라면, l=4에서 멈출것이다... mid= (4+5)/2 = 4가 되므로..
while(l<r)로 고친다해도 l=4, r=5이므로 무한 루프일 것 같은데.. 음...
다른 분의 코드를 보니 while(r-l>1) 처럼 하신 분도 있는데, 그 분은 r=mid-1이 아니라 r=mid로 하셨다.
일단 생각해보니 그냥 내 방식대로 하면서 그 때 그 때 l이냐 r이냐를 생각해서 찾거나, ans변수를 따로 사용해서 하는 것이 좋을 것 같다.

댓글 없음:

댓글 쓰기