1. ans를 밖에 빼놓고 구간은 [lo, hi]로 잡고 mid를 절대 구간에 포함시키지 않는 방법
int lo = 0, hi = n;
int ans;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (check(mid)) {
ans = mid;
lo = mid + 1;
}
else hi = mid - 1;
}
2. lo < mid < hi 를 유지시키고, mid를 구간에 포함시켜서 lo or hi가 ans를 갖게하는 방법
int lo = 0, hi = n;
while (lo + 1 < hi) {
int mid = (lo + hi) / 2;
if (check(mid)) lo = mid;
else hi = mid;
}
1번도 직관적이고 2번도 꽤 와닿긴 하네...
https://usaco.guide/silver/binary-search?lang=cpp
개인적으로 1번을 쓸 이유가 없다고 생각함. 잘하는 사람들 중에 1번처럼 쓰는사람 아무도 못봄
1번 미만잡. 1번으로 하면 ans 초기변수를 잡아줄 수 있어서 답을 못 찾는 경우도 처리 깔끔해짐 - dc App
올
의견이 갈리네
나는 항상 범위 inclusive하게 잡고 while문은 (lo < hi) 이고 lo와 hi가 1 차이나는 것만 체크해주면 mid = (lo+hi+1)/2인지 mid = (lo+hi)/2인지 정하면 되어서 지금까지 한번도 헷갈리거나 실수한적이 없었는데 사람들이 어디서 헷갈려하는건지 잘 모르겠음
난 매번 1번형식으로 코딩해왔고 2번형태로 코딩해본적 한번도 ㅇ벗네
1번은 이분탐색 끝난 후 최종 답이 lo인지 hi인지 헷갈려서 2번형태로씀
아니면 while문조건 lo
답글 짤렸네. 조건은 lo
왜자꾸 잘리지
1번은 이분탐색 끝난후 답이 항상 ans야 lo hi 관계없이
아 ans를 따로두면 되는구나
1번이 더 와닿지않냐, 근데 의견 ㅈㄴ 갈리는거 개웃기노 ㅋㅋ
1번쓰면 공집합 어떻게표현해?
공집합이라는게 check(mid)가 모두 false인 경우를 말하면 ans의 초기값이 공집합임. - dc App
lo hi 범위가 예쁘게 안나올때. 백터가 비었다고 생각해봐.
lo가 hi보다 작은 경우는 while문에서부터 걸러지지 않나?
아 반대
lo,hi가 unsigned면?
2번을 주로 쓰는데, 반열린구간 [lo, hi)에서 원하는 답이 [lo, mid)에 있는지 [mid, hi)에 있는지 생각하면서 하니까 개인적으로는 방법을 잘 안 잊고 문제도 잘 해결되는 것 같음 - dc App
2번 익히고나서 1번안씀
누굴 가르치는 입장일땐,1번으로 이해시킴. - dc App
난 반열린구간을 좋아해서 2번씀 근데 닫힌구간 좋아하는 사람들은 1번 더 좋아하는거같음