ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준(BOJ) 1654번 랜선 자르기
    알고리즘 풀이/백준(Boj) 2019. 9. 6. 14:52

    문제 : https://www.acmicpc.net/problem/1654


    문제

    집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.

    이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm 은 버려야 한다. (이미 자른 랜선은 붙일 수 없다.)

    편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.


    풀이 :


    랜선의 길이가 2^32 - 1 이기에 완전 탐색은 불가능 할것이다. 그래서 이분탐색을 통해 풀어 보았다. 


    제일 작은 랜선은 1, 제일 큰 랜선은 주어진 랜선중 가장 큰 랜선이 될 것. 랜선의 길이는 최대 2^32-1이기에 long long 자료형을 써주어


    야 한다.


    N개보다 많이 만드는 것도 N개를 만드는 것에 포함이 되니 이분 탐색을 진행하면서 N 보다 크거나 같아지는 경우에 sum을 갱신해주고 더 긴 


    랜선이 있는지 탐색한다.


    N보다 작다면 랜선의 길이를 줄이고 탐색한다.



    코드 ( C++ )

    #include <iostream>

    #include <vector>

    #include <algorithm>

    using namespace std;

    int K, N;

    vector<int> line;

    long long calc(long long mid)

    {

    long long temp = 0;

    for (int i = 0; i < K; ++i)

    {

    temp += line[i] / mid;

    }

    return temp;

    }

    int main()

    {

    ios_base::sync_with_stdio(false);

    cin.tie(0);

    cin >> K >> N;

    line = vector<int>(K, 0);


    for (int i = 0; i < K; ++i) 

    cin >> line[i];


    sort(line.begin(), line.end());


    long long small = 1;

    long long big = line[line.size() - 1];

    long long sum = 0;

    while (small <= big)

    {

    long long mid = (small + big) / 2;

    if (calc(mid) >= N)

    {


    sum = max(sum, mid);

    small = mid + 1;

    }

    else if (calc(mid) < N)

    {

    big = mid - 1;

    }

    }


    return 0;

    }





    '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글

    백준(BOJ) 12865번 평범한 배낭  (0) 2019.09.10
    백준(BOJ) 1783번 병든 나이트  (0) 2019.09.08
    백준(BOJ) 14499번 주사위 굴리기  (31) 2019.09.05
    백준(BOJ) 4307번 개미  (0) 2019.09.02
    백준(BOJ) 1904 01타일  (0) 2019.09.02
Designed by Tistory.