[BOJ] 1654번 | λžœμ„  자λ₯΄κΈ° (C++)

2023. 9. 2. 18:59ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

1654번: λžœμ„  자λ₯΄κΈ°

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 가지고 μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ

www.acmicpc.net

 

πŸ§‘πŸ»‍πŸ’»ν’€μ΄ κ³Όμ •

K개의 λžœμ„ λ“€μ„ 잘라, λ™μΌν•œ 길이둜 N개 이상을 λ§Œλ“  경우의 μˆ˜λ“€ 쀑 κ°€μž₯ κΈ΄ λ‹¨μœ„ 길이λ₯Ό 찾으면 λ˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ§€κ°œλ³€μˆ˜ 탐색(Parametric Search)을 μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€. 사싀 λ§€κ°œλ³€μˆ˜ νƒμƒ‰μ΄λž€ μš©μ–΄λ₯Ό 였늘 처음 λ“€μ–΄λ΄€λŠ”λ°, λ‚΄μš©μ„ λ³΄λ‹ˆ μ œκ°€ μ•Œκ²Œ λͺ¨λ₯΄κ²Œ μ‚¬μš©ν–ˆλ˜ λ°©λ²•μ΄λ”κ΅°μš”.

 

μ•Œκ³ λ¦¬μ¦˜μ€ κ°„λ‹¨ν•©λ‹ˆλ‹€.

  1. λ°°μ—΄(arr)에 μ €μž₯λ˜μ–΄ μžˆλŠ” K개의 λžœμ„ λ“€μ„ μ˜€λ¦„μ°¨μˆœ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.
  2. 이진 탐색(Binary Search)을 μ‘μš©ν•˜μ—¬ 탐색을 μ‹œμž‘ν•  κ²λ‹ˆλ‹€.
    • leftλŠ” κ°€μž₯ μž‘μ€ 길이(1), rightλŠ” κ°€μž₯ κΈ΄ 길이(arr[K-1])의 값을 κ°€μ§‘λ‹ˆλ‹€.
    • left \( \leq \) rightκ°€ 될 λ•ŒκΉŒμ§€, λ‹€μŒμ„ λ°˜λ³΅ν•©λ‹ˆλ‹€.
      • mid = (left + right) / 2 값을 κ΅¬ν•©λ‹ˆλ‹€.
      • K개의 케이블을 μ°¨λ‘€λŒ€λ‘œ 돌며, mid λ‹¨μœ„λ‘œ μž˜λžμ„ λ•Œμ˜ 개수(cable / mid)λ₯Ό λˆ„μ ν•΄ μ €μž₯ν•©λ‹ˆλ‹€.
      • κ·Έλ ‡κ²Œ 얻은 총 κ°œμˆ˜κ°€ N개 이상이면, left = mid + 1둜 두고 ν•΄λ‹Ή κ°œμˆ˜λŠ” λ³„λ„λ‘œ μ €μž₯ν•΄λ‘‘λ‹ˆλ‹€.
      • μ•„λ‹ˆλΌλ©΄, last = mid - 1둜 λ‘‘λ‹ˆλ‹€.
  3. μœ„μ˜ 이진 탐색을 톡해 얻은 κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <iostream>
#include <vector>
#include <algorithm>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;
using uint32 = unsigned int;

uint32 FindLongestCableLength(const vector<int>& cables, const int N)
{
    uint32 start = 1, last = cables.back();
    uint32 answer = 0;

    while (start <= last)
    {
        uint32 mid = (start + last) / 2;
        uint32 count = 0;

        for (const auto& cable : cables)
            count += (cable / mid);

        if (count >= N)
        {
            answer = mid;
            start = mid + 1;
        }

        else
            last = mid - 1;
    }

    return answer;
}


int main()
{
    FAST_IO;

    int K, N;
    cin >> K >> N;

    vector<int> lanCables(K);
    for (int i = 0; i < K; i++)
        cin >> lanCables[i];

    sort(lanCables.begin(), lanCables.end());
    int answer = FindLongestCableLength(lanCables, N);

    cout << answer;
    return 0;
}

 

λžœμ„ μ˜ μ΅œλŒ€ 길이가 \( 2^{31} - 1 \)이라고 ν–ˆμœΌλ―€λ‘œ, int μžλ£Œν˜•μ€ midλ₯Ό κ΅¬ν•˜λŠ” κ³Όμ •μ—μ„œ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ‚  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” unsigned intλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, long long을 μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

그리고 μ˜μ•„ν–ˆλ˜ 게, answer = max(answer, count)λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ μ •λ‹΅ μ²˜λ¦¬κ°€ λ˜λ”λΌκ΅¬μš”. ν¬ν•œν•˜λ„€μš”.

 

728x90
λ°˜μ‘ν˜•