본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1654 랜선 자르기

by 까망 하르방 2021. 3. 6.
반응형

출처https://www.acmicpc.net/problem/1654

Approach

Binary Search (이분 탐색) 

 

Binary Search (이분 탐색)

Binary Search (이분 탐색) 정렬된 자료에서 목표값을 찾고자 할 때, 사용되는 탐색기법 O(logN) 리스트 중간의 값(mid)을 선택하여 찾고자 하는 값과 비교하는 방식 분할 정복 알고리즘(Divide and Conquer Al

zoosso.tistory.com

[탐색] Parametric Search 

 

[탐색] Parametric Search

Parametric Search 최적화 문제를 결정 문제로 바꿔 푸는 것 O(logN) ex) Binary Search (이분 탐색)을 이용해서 Lower/Upper Bound를 구하는 경우가 많습니다. Binary Search (이분 탐색) Binary Search (이분 탐..

zoosso.tistory.com

0 (left)에서 가지고 있는 가장 긴 랜선 길이(right)까지

모든 경우의 수로 몇 개의 랜선이 나올 수 있는지 구한다면 TLE 발생

 

따라서 left ~ right 기준으로 해서 모두 탐색하지 않고 이분 탐색으로

기준 잡는 횟수를 줄인다.

제출 코드에서는 right는 LLong_MAX로 간단하게 처리

 

주의 사항

- 자른 랜선의 개수가 n개 이상이기에 n개로 맞게 떨어질 필요가 없다.

- int형으로 처리하는 경우 overflow 발생하므로 long long 으로 처리


#include <stdio.h>
#include <climits>
typedef long long LL;
int N, K, cnt, lan[10001];
LL left, right, mid, ans;

int main(void) {
    // freopen("input.txt", "r", stdin);
    
    scanf("%d %d", &K, &N);
    for (int i = 0; i < K; i++) {
        scanf("%d", lan + i);
    }
    
    right = LLONG_MAX;
    while (left <= right) {
        cnt = 0; // 랜선 개수
        mid = (left + right) / 2; // 기준
        // 가지고 있는 K개의 랜선을 mid 길이로 자를 때 개수
        for (int i = 0; i < K; i++) {
            cnt += (lan[i] / mid);
        }
        // N개 이상을 만족한다면 기준 길이(mid)를 올린다.
        if (cnt >= N){
            left = mid + 1;
            if (mid > ans)
                ans = mid;
        }
        else
            right = mid - 1;
    }
    printf("%lld\n", ans);
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 14867 물통  (0) 2021.03.30
[BOJ] 백준 17616 등수 찾기  (0) 2021.03.13
[BOJ] 백준 11727 2×n 타일링 2  (0) 2021.03.01
[BOJ] 백준 11723 집합  (0) 2021.02.28
[BOJ] 백준 11811 데스스타  (0) 2021.02.28

댓글