Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 10992
- 모든행과열대각선의합
- 연속부분수열
- 보이는 학생
- 자바
- GitHub #Commit #BaekJoon
- 격자판
- 큰 수 출력하기
- 10991
- 최대 길이
- Pointer
- array
- 배열
- 두 배열 합치기
- 뒤집은 소수
- 아스키코드
- 백준
- 알고리즘
- 공통원소 구하기
- ArrayList
- 누적 계산
- 인프런
- Two Pointer
- 가장 짧은 문자거리
- 임시반장 정하기
- 코테준비
- 등수구하기
- 투 포인터
- java
- 점수계산
Archives
- Today
- Total
ezhoon
[인프런] 06-10 마구간 정하기 (결정알고리즘) 본문
[Java] 인프런 문제풀이/Sorting and Searching (정렬, 이분검색과 결정알고리즘)
[인프런] 06-10 마구간 정하기 (결정알고리즘)
ezhoon 2022. 2. 8. 16:29📖 문제
- 첫 줄에 자연수 N(3 <=N <=200,000)과 C(2 <=C <=N)이 공백을 사이에 두고 주어집니다.
- 둘째 줄에 마구간의 좌표 xi(0<=xi<=1,000,000,000)가 차례로 주어집니다.
- N개의 마구간이 수직선상에 있습니다. 각 마구간은 x1, x2, x3, ......, xN의 좌표를 가지며,
마구 간간에 좌표가 중복되는 일은 없습니다. 가장 가까운 두 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶습니다. - C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최댓값을 출력하는 프로그램을 작성하세요.
- 현수는 C마리의 말을 가지고 있는데, 이 말들은 서로 가까이 있는 것을 좋아하지 않습니다. 각 마구간에는 한 마리의 말만 넣을 수 있고,
- N개의 마구간이 수직선상에 있습니다. 각 마구간은 x1, x2, x3, ......, xN의 좌표를 가지며,
⚠️ 주의사항
- 입력 된 값이 정렬되지 않은 배열 일 수도 있다.
- 이분 검색을 활용 할 것
✍️ 이해
/**
* 1. N 과 C 입력, N개로 이루어진 배열 arr
* 2. 이분검색 하던대로 while문까지 생성
* 2-1. arr을 sort해주고 lt는 1부터 시작
* 3. cnt = 1 초기화후 arr의 크기 만큼 반복, temp = arr[0]; 말 배치
* 3-1. 말이 배치 될 수 있는 곳인지 확인 할 것
* 3-2. arr[i] - temp >= mid -> cnt증가, temp를 arr[i]로 초기화
* 3-3. return cnt;
* 4. if cnt 값이 말의 수 보다 크거나 같으면 cnt 증가, mid 기준 왼쪽 값 볼 필요 없어짐 -> lt = mid + 1;
* 5. else -> 오른쪽 값 볼 필요 없으므로 rt = mid - 1;
* 6. return answer;
*/
✏️ 풀이
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public int count(int[] arr, int mid) {
int cnt = 1;
int temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i] - temp >= mid ) {
cnt++;
temp = arr[i];
}
}
return cnt;
}
public int solution(int N, int C, int[] arr) {
int answer = 0;
Arrays.sort(arr);
int lt = 1;
int rt = arr[N - 1];
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (count(arr, mid) >= C) {
answer = mid;
lt = mid + 1;
}else rt = mid - 1;
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int C = sc.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = sc.nextInt();
}
System.out.println(T.solution(N, C, arr));
}
}
'[Java] 인프런 문제풀이 > Sorting and Searching (정렬, 이분검색과 결정알고리즘)' 카테고리의 다른 글
[인프런] 6-9 뮤직비디오 (결정알고리즘) (0) | 2022.02.08 |
---|---|
[인프런] 06-08 이분검색 / 순차검색 (0) | 2022.02.07 |
[인프런] 06-07 좌표 정렬 (0) | 2022.02.06 |
[인프런] 6-6 장난꾸러기 (0) | 2022.02.05 |
[인프런] 06-05 중복확인 (0) | 2022.02.04 |
Comments