본문 바로가기

Algorithm/Binary Search

(6)
가사 검색 유형 분석 및 구현 이 문제는 일단 이진탐색으로 풀되, 문자열을 뒤집는 방법이나 bisect활용을 다양하게 할 줄 아는가에 대한 여부를 파악해야하는 문제인 듯 하다. 또한 효율성 체크 또한 중요하다. - 항상 답안 제출시 print 남용된것 없나 확인 - 각 행을 정렬할건지 전체 리스트를 정렬할건지 확인하자 - 문제에 n(배열의 크기)가 입력되지 않는다면 max값으로 설정하자. 코드 from bisect import bisect_left, bisect_right # 찾고자하는 문자열의 시작인덱스와 마지막인덱스를 구할 수 있다. # 또한 이 문제 같은 경우는 left_value와 right_value를 달리하여 # left_value < 데이터 < right_value , 즉, 해당 범위 안에 있는 값을 ..
고정점 찾기 유형 파악 및 구현 이 문제는 두가지 방법으로 풀 수 있다. 파이썬에서 제공해주는 함수를 이용하거나 그냥 이진탐색을 내가 구현한다. 배열은 이미 정렬되어있다. "정렬되어 있는"이라는 말이 나오면 이진 탐색을 의심하는 것도 좋은 습관인 것 같다. 1. 이진 탐색 구현 방식은 그동안 하던 방식과 동일하다. 하지만 정당한지 봤을 때, 예를 들어 인덱스 2에 3이 있다고 가정하자. 인덱스 3부터는 value가 무조건 3보다는 클것이다. 따라서 이런 경우, 굳이 다음 부분을 확인할 필요가 없게 된다. 반대 경우도 마찬가지이다. 2. 함수 사용 bisect_left or bisect_right를 이용해 구현 가능하다. 이는 이진탐색을 기반으로 하는 탐색 알고리즘이다. 코드 arrays = [-15, -6, 1, 3..
정렬된 배열에서 특정 수의 개수 구하기 유형 분석 및 구현 이 문제는 직접 이진탐색을 구현한다기 보단, 파이썬에서 제공하는 이진탐색을 활용한 탐색 방법을 사용한다. 순차적 탐색과 비교해보면 최대 100만개에 데이터 중에서 최대 100만개의 데이터를 찾아야한다. 하지만 이진 탐색을 활용하면 확 줄어든다. 코드 from bisect import bisect_left, bisect_right n = 7 x = 2 array = [1, 1, 2, 2, 2, 2, 3] left_index = bisect_left(array, x) right_index = bisect_right(array, x) print(left_index, right_index) result = right_index-left_index if result == 0: print("-1..
떡볶이 떡 만들기 유형 파악 및 구현 떡의 최대 개수는 백만이고 요청한 떡의 최대 길이는 20억이다. 즉, 떡 백만개에 대해서 0부터 20억 사이의 값으로 잘랐을 때, 원하는 길이가 나와야되고 안나온다면 가장 가까운 값을 출력해야하는 문제이다. 만약, 자르는 길이 선정을 순차적 탐색으로 이를 구현한다고 했을 때, 1cm단위로 자르다 20억cm단위까지 잘라봐서 떡의 길이의 합이 m일 때 멈춘다. 최악의 경우 20억*100만의 연산을 한다. 시간 복잡도는 O(N*M) 반대로, 이진탐색으로 자르는 길이를 탐색한다면, 정렬을 할 필요는 없으므로, 정렬에 대한 연산 비용이 들지 않으니 고려하지 않고 시간 복잡도는 O(M*logN)이다. 따라서 이 문제는 무조건 이진탐색을 사용해야 한다. 코드 n = 4 m = 7 arrays = ..
부품 찾기 유형 분석 및 구현 이 문제는 이진탐색 또는 계수 정렬을 통해 풀 수 있다. 조건은 다음과 같다. N = 최대 백만 정수의 범위는 백만이하이다. M = 최대 10만 예를 들어, 이 문제를 순차적 탐색으로 해결한다고 가정하면 시간 복잡도는 log(M*N)이다. N(앞에서부터 하나하나 확인해가면 찾으려는 값일 때, 끝냄) M(찾으려는 값 수) 최악의 경우 1조회의 연산이 필요하다. 하지만 이진탐색으로 해결시 우선 정렬이 필요한데, 파이썬의 정렬의 연산수는 NlogN이다. 이 후 이진탐색으로 해결시 M개의 데이터에 대해 총 MlogN이다. 결과적으로 시간 복잡도는 O((N+M)logN)이다. 굉장히 작아짐을 알 수 있다. "연산 계산시 조건에 맞추어 풀 수 없다는 것을 직감한다면 바로 이진탐색을 사용하자." ..
Binary Search - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. 순차탐색 - 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 - 시간복잡도 : O(N) 이진 탐색 - 정렬된 배열에 대해서 반으로 쪼개가며 확인하는 방법 - 시간복잡도 : O(logN) - 구현 방법 : 반복문 or 재귀 함수 유형 " 코드를 정리하고 최대 탐색범위와 시간복잡도를 고려할 때, 연산의 수가 2000만(파이썬 평균 연산 수)를 넘어간다면 이진탐색 또는 계수 정렬 등을 고려하자. " " 정렬되어있을 때 라는 말이 많이 나옴"