티스토리 뷰

알고리즘

44. 마구간 정하기

홍복치 2020. 12. 18. 21:17

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

53

1
2
8

4

9

 

출력예제 1 

3

 

풀이 

- 이분탐색 응용

- 마구간 개수 n의 범위가 광범위하므로, 동적할당 해준다 > 프로그램 종료 전 delete

- 마구간 좌표는 수직이고, 그 사이 거리들에 대한 정보가 필요함 > 정렬 필요, sort함수 사용

- mid: 이분탐색 시 키 값, 3마리의 말을 수용할 수 있을 시에 res값을 mid값으로 설정

 

이분탐색 시 상황

(1) 해당 mid값이 3마리의 말 수용 가능할 때

> 3마리의 말을 수용할 수 있는 mid보다 큰 수는 당연히 3마리의 말을 수용할 수 있음

> 문제에서 물어보는 값이 "최대거리"이기 때문에 lt=mid+1로 옮겨서 최대거리를 찾는다.

 

(2) 해당 mid값이 3마리의 말 수용 불가능할 때

> mid보다 작은 거리에 정답이 있다는 것

> rt=mid-1으로 옮겨서 찾는다.

 

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int n;

// 44. 마구간 정하기(결정 알고리즘)

int Count(int len, int x[]){
    int i, pos=x[1], cnt=1;
    for(i=2;i<=n;i++){
        if(x[i]-pos>=len){
            cnt++;
            pos=x[i];
        }
    }
    return cnt;
}

int main() {
    int m, i, lt=1, rt, mid,res;
    scanf("%d %d", &n, &m); //n: 마구간 좌표, m: 말 마리 수
    int *x = new int[n+1]; //n 범위가 큼 => 동적할당
    
    for(i=1;i<=n;i++){
        scanf("%d",&x[i]);
    }
    sort(x+1,x+n+1); //배열 정렬
    rt=x[n]; //가장 큰 좌표를 rt
    
    //이분탐색
    while(lt<=rt){
        mid=(lt+rt)/2;
        if(Count(mid,x)>=m){
            res=mid;
            lt=mid+1;
        }
        else rt=mid-1;
    }
    printf("%d\n", res);
    delete[] x; //배열 할당 해제
    return 0;
}
 

'알고리즘' 카테고리의 다른 글

46. 멀티태스킹(카카오 먹방 문제 변형)  (0) 2020.12.22
45. 공주구하기  (0) 2020.12.21
43. 뮤직비디오  (0) 2020.12.17
24. 이분검색  (0) 2020.12.16
19. 분노유발자  (0) 2020.04.17
최근에 올라온 글
Total
Today
Yesterday