일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Promise
- SSR
- autosize
- TS
- 투포인터
- dfs
- 태그된 유니온
- 공변성
- 호이스팅
- map
- async/await
- CI/CD
- 무한 스크롤
- recoil
- 리터럴 타입
- app router
- 반공변성
- Cypress
- ESlint
- CORS
- 인터섹션
- tailwind
- Jest
- 이분 검색
- webpack
- React
- useAppDispatch
- 결정 알고리즘
- RTK Query
- 타입 좁히기
Archives
- Today
- Total
짧은코딩
마구간 정하기(결정 알고리즘), 이분검색 본문
반응형
코드
function solution(c, stable) {
let answer;
stable.sort((a, b) => a - b);
let lt = 1,
rt = stable.slice(-1)[0];
while (lt <= rt) {
let mid = parseInt((lt + rt) / 2);
let ep = stable[0];
let count = 1;
for (let i = 1; i < stable.length; i++) {
if (stable[i] >= ep + mid) {
count++;
ep = stable[i];
}
}
if (count >= c) {
answer = mid;
lt = mid + 1;
} else rt = mid - 1;
}
return answer;
}
풀이 방법
이 문제도 이분검색으로 풀어야하는 문제이다.
-lt, rt의 정의
두 말 사이의 거리는 [1, 가장 큰 마구간의 좌표]이다. 배열에서 가장 작은 값이 100이어도 다음 숫자는 101부터 올 수 있기 때문에 두 말 사이의 최소값은 1이다. 따라서 lt에 1, rt에 가장 큰 마구간의 좌표를 넣는다.
-while문
1. while문의 종료 조건은 lt <= rt로 두고 mid도 (lt + rt) / 2로 둔다.(이분 검색의 초반과 같음)
2. count는 현재 둔 말의 수이며 처음에 1로 둔다. 왜냐하면 가장 첫번째 마구간에는 무조건 말을 넣어야 하기 때문이다.
3. 여기서 mid는 두 말 사이의 최대 거리이다. 따라서 ep에는 가장 첫번째 마구간 좌표를 넣는다. 그러면 ep + mid보다 크거나 같은 마구간 좌표에 다음 말을 둘 수 있다.
4. for문은 가장 첫번째 마구간에는 무조건 말이 들어가니 1부터 시작한다. for문 안에서 현재 마구간이 ep보다 크거나 같은 좌표에 있다면 count를 1 올려주고 ep도 현재 좌표로 최신화한다.
5. for문이 끝나고 나서 count >= c이면 answer에 mid를 저장한다. 그리고 mid를 더 늘려야하기 때문에 lt = mid + 1을 한다.
count < c이면 mid를 줄여야하기 때문에 rt = mid - 1을 한다.
반응형
'코딩테스트 with JS > 자바스크립트 알고리즘 문제풀이(인프런)' 카테고리의 다른 글
동전교환(DFS) (0) | 2022.12.20 |
---|---|
부분집합 구하기(DFS) (0) | 2022.12.18 |
뮤직비디오(결정 알고리즘), 이분검색 (0) | 2022.12.13 |
결혼식 (0) | 2022.12.11 |
LRU(Least Recently Used) (0) | 2022.12.05 |
Comments