일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- APOLLO
- 릿코드
- 브라우저
- 해시테이블
- 스택
- 이진탐색
- 자바스크립트
- 프로그래머스
- 알고리즘
- RT scheduling
- 컨테이너
- 연결리스트
- 타입스크립트
- 웹팩
- pytorch
- C
- RxJS
- 자료구조
- cors
- GraphQL
- 연결 리스트
- Machine Learning
- 큐
- vue3
- alexnet
- 프론트엔드
- 배열
- 코딩테스트
- 프로세스
- 포인터
- Today
- Total
목록이진탐색 (9)
프린세스 다이어리
1. 접근 방법 mid의 제곱이 바로 찾는 값이 되면 true를 반환하고, 이진탐색으로 left와 right를 옮겨가며 마지막까지 남은 mid값이 조건을 충족하지 않는다면 false를 반환한다. 2. 전체 풀이 /** * @param {number} num * @return {boolean} */ var isPerfectSquare = function(num) { if (num === 1) return 1; let left = 1; let right = Math.floor(num / 2); while (left
문제 링크 1. 접근 방법 (1) 주어지는 배열이 오름차순 정렬돼 있고, 특정 조건에 따라 피벗 값을 기준으로 검사 위치를 변경해가며 푸는 문제이므로 이진 탐색 문제다. (2) left는 나중에 slice할 범위의 왼쪽 끝 인덱스다. (3) right가 arr.length - k로 초기화되어 있는 이유는 left 인덱스로부터 k만큼 자르기 위해 가능한 최대 인덱스이기 때문이다. let left = 0; let right = arr.length - k; (4) left
문제 링크 두시간 가까이 걸림.. 1. 접근 방법 (1) 중복을 허용한 오름차순 배열이 주어지고 + O(logN) 시간복잡도로 풀으라고 했으며 + 피벗을 기준으로 왼쪽과 오른쪽의 값을 비교해야 하는 문제이므로 이진탐색으로 푼다. (2) getIndex 라는 함수를 만들어서, 배열, 타깃, isLeftArray를 파라미터로 받아 주어진 타깃 범위의 첫 인덱스 또는 범위의 마지막 인덱스를 리턴하도록 한다. const getIndex = (nums, target, isLeftIndex) => { if (nums.length === 0) return -1; let left = 0; let right = nums.length - 1; let mid = 0; if (isLeftIndex) { // ... } els..
문제 링크 이전 회전배열 탐색 문제 풀고 오니 핵쉬움 3분컷(문제 풀이 조건이 쉽게 주어지긴 했음) 1. 접근 방법 (1) mid 값이 mid - 1 값보다 작은 경우, 회전된 상태에서 mid값이 인덱스 0인 경우이므로 mid의 값을 반환한다. if (nums[mid - 1] > nums[mid]) return nums[mid]; (2) mid 기준 왼쪽이 정렬된 상태면 left를 mid + 1로 옮겨 준다, (3) mid 기준 오른쪽이 정렬된 상태면 right를 mid로 옮겨 준다. if (nums[0] < nums[mid]) { // 왼쪽이 정렬된 상태일 때 left = mid + 1; } else { // 오른쪽이 정렬된 상태일 때 right = mid; } (4) 주어지는 배열의 길이가 1이거나 ..
문제 링크 이진탐색으로 푸는 것 자체는 별로 어렵진 않았으나 슬슬 이진탐색 풀이가 필요하다는 것을 떠올리기 힘들 것 같음 1. 접근 방법 (1) 정렬이 돼 있지 않은 nums가 주어짐에도 문제가 이진 탐색 분류 내에 있는 이유는 역시 기준 mid의 양옆 원소를 비교해서 왼쪽이 클 때와 오른쪽이 클 때를 구분하는 로직이 필요하기 때문임 (2) mid의 양옆 원소가 mid보다 작으면 mid 리턴. if (nums[mid - 1] nums[mid + 1]) return mid; (3) mid의 원소가 mid+1의 원소보다 작으면 left를 mid의 오른쪽으로 넘겨줌. (4) mid의 원소가 mid+1의 원소보다 보다 크면 right를 mid 값으로 옮겨줌. if..
문제 링크 왜 "Advanced" Binary Search 인지 모르겠으나 여기서 원하는 대로 풀어드림. 1. 접근 방법 (1) 장애 난 버전이랑 그렇지 않은 버전을 나누어서 탐색하면 되므로 이진탐색으로 접근한다 (2) 이전 버전 mid - 1이 정상 버전이고 지금 검사중인 mid 버전이 장애 난 버전이면 지금 검사중인 mid 버전 리턴. if (!isBadVersion(mid - 1) && isBadVersion(mid)) return mid; (3) 그 외 경우에서, 지금 버전 mid가 장애 난 버전이면 왼쪽 리스트 탐색하고, 정상 버전이면 오른쪽 리스트를 탐색한다. if (isBadVersion(mid)) { right = mid; } else { left = mid + 1; } (4) left 리..
1. 접근 방법 (1) mid기준 오른쪽이 정렬됐을 경우와, mid기준 왼쪽이 정렬됐을 경우를 나눈다. if (nums[left]
문제 링크 1. 접근방법 (1) mid를 제곱근으로 두고, low는 1, high는 x의 절반 값으로 둔다. 제곱근은 x의 절반보다 클 수 없다. let low = 1; let high = x / 2; let mid = 0; (2) 기본 이진탐색을 진행한다. 단, low와 high를 옮기는 판단 기준은 mid * mid가 x보다 큰지 작은지로 설정한다. while (low x) return mid - 1; (4) 1의 경우 제곱근을 1로 리턴하도록 예외처리를 추가한다. if (x