Study note/Coding test

Binary Search

공대 아로마 2024. 4. 12. 17:25

기술면접을 위해 기초 CS에 대한 복습중이다.
공부한 내용 중 요점이나 나중에 기억해야할 부분을 정리해보려고 한다.
내가 아는 부분은 생략되어 있을 수 있고, 혹여나 틀린 부분이 있을 수도 있으니 이 글을 보고 '다른 사람'이 공부하기에는 도움이 되지 않을 수 있으니 주의!

이진탐색

  • 정렬되어 있는 리스트에서 절반씩 좁혀가며 탐색한다.
  • 시작점, 끝점, 중간점을 이용한다.
  • 시간 복잡도: $O(logN)$
    // 이진 탐색 소스코드 구현(반복문)
    int binarySearch(vector<int>& arr, int target, int start, int end) {
      while (start <= end) {
          int mid = (start + end) / 2;
          // 찾은 경우 중간점 인덱스 반환
          if (arr[mid] == target) return mid;
          // 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
          else if (arr[mid] > target) end = mid - 1;
          // 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
          else start = mid + 1;
      }
      return -1;
    }

파라메트릭 서치 (Parametric Search)

  • 최적화 문제를 결정문제(Y or N)로 바꾸어 해결하는 기법
  • 이진 탐색을 이용하여 해결할 수 있다.

기타 필요한 C++ STL

  • vector::iterator는 포인터처럼 요소들의 위치와 연관된 동작을 하는 객체

      vector<int> v;
      vector<int>::iterator itr;
      //itr을 v의 시작위치를 갖게 선언
      itr = v.begin();
  • lower_bound, upper_bound는 vector에서 해당 위치를 리턴한다.

      // v = {10 10 10 20 20 20 30 30}
      low = std::lower_bound (v.begin(), v.end(), 20);  // 3
      up = std::upper_bound (v.begin(), v.end(), 20);  // 6
  • lower_bound는 x보다 작지 않은 최초의 숫자의 iterator를 반환한다. 예를 들어 lower_bound(13)이면 맨 앞쪽 20 (네 번째 원소)의 iterator가 반환된다.

  • upper_bound는 x보다 큰 최초의 숫자의 iterator를 반환한다. 예를 들어 upper_bound(13)이면 마찬가지로 맨 앞쪽 20 (네 번째 원소)의 iterator가 반환된다.


참고한 사이트

'Study note > Coding test' 카테고리의 다른 글

Hash 문법 정리 (C++)  (0) 2024.04.12
DP - Dynamic Programming  (0) 2024.04.12
그래프 탐색 알고리즘: DFS/BFS  (0) 2024.04.12
그리디 & 구현  (0) 2024.04.12
코딩 테스트에서 주의할 점  (1) 2024.04.12