πŸ•οΈ ICPC Sinchon/Binary Search

[BOJ][C++] λ°±μ€€ 1654번: λžœμ„  자λ₯΄κΈ°

선달 2023. 11. 17. 01:51
λ°˜μ‘ν˜•

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

 

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

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

www.acmicpc.net

 

문제

μ§‘μ—μ„œ μ‹œκ°„μ„ λ³΄λ‚΄λ˜ μ˜€μ˜μ‹μ€ λ°•μ„±μ›μ˜ 뢀름을 λ°›κ³  κΈ‰νžˆ 달렀왔닀. 박성원이 μΊ ν”„ λ•Œ μ“Έ N개의 λžœμ„ μ„ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ° λ„ˆλ¬΄ λ°”λΉ μ„œ μ˜μ‹μ΄μ—κ²Œ 도움을 μ²­ν–ˆλ‹€.

이미 μ˜€μ˜μ‹μ€ 자체적으둜 K개의 λžœμ„ μ„ 가지고 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ K개의 λžœμ„ μ€ 길이가 μ œκ°κ°μ΄λ‹€. 박성원은 λžœμ„ μ„ λͺ¨λ‘ N개의 같은 길이의 λžœμ„ μœΌλ‘œ λ§Œλ“€κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— K개의 λžœμ„ μ„ μž˜λΌμ„œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 300cm 짜리 λžœμ„ μ—μ„œ 140cm 짜리 λžœμ„ μ„ 두 개 μž˜λΌλ‚΄λ©΄ 20cmλŠ” 버렀야 ν•œλ‹€. (이미 자λ₯Έ λžœμ„ μ€ 뢙일 수 μ—†λ‹€.)

편의λ₯Ό μœ„ν•΄ λžœμ„ μ„ 자λ₯΄κ±°λ‚˜ λ§Œλ“€ λ•Œ μ†μ‹€λ˜λŠ” κΈΈμ΄λŠ” μ—†λ‹€κ³  κ°€μ •ν•˜λ©°, 기쑴의 K개의 λžœμ„ μœΌλ‘œ N개의 λžœμ„ μ„ λ§Œλ“€ 수 μ—†λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•˜μž. 그리고 자λ₯Ό λ•ŒλŠ” 항상 μ„Όν‹°λ―Έν„° λ‹¨μœ„λ‘œ μ •μˆ˜κΈΈμ΄λ§ŒνΌ 자λ₯Έλ‹€κ³  κ°€μ •ν•˜μž. Nκ°œλ³΄λ‹€ 많이 λ§Œλ“œλŠ” 것도 N개λ₯Ό λ§Œλ“œλŠ” 것에 ν¬ν•¨λœλ‹€. μ΄λ•Œ λ§Œλ“€ 수 μžˆλŠ” μ΅œλŒ€ λžœμ„ μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 가지고 μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ ν›„ K쀄에 걸쳐 이미 가지고 μžˆλŠ” 각 λžœμ„ μ˜ 길이가 μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ μž…λ ₯λœλ‹€. λžœμ„ μ˜ κΈΈμ΄λŠ” 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 N개λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λžœμ„ μ˜ μ΅œλŒ€ 길이λ₯Ό μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ 좜λ ₯ν•œλ‹€.

 

풀이

lan ν•¨μˆ˜λŠ” length 길이의 λžœμ„ μ΄ λ‚˜μ˜€λŠ” 갯수λ₯Ό λ°˜ν™˜ν•œλ‹€.

lan() 값이 n보닀 ν¬κ±°λ‚˜ κ°™κ²Œ λ‚˜μ˜€λŠ” lengthλ“€μ˜ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λ©΄λ¨.

즉 length에 막 λŒ€μž…ν•΄μ„œ 쑰건에 λ§žλŠ”κ±Έ 골라내면 λ˜λŠ”λ°,

 

이 κ³Όμ •μ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜κΈ° λ•Œλ¬Έμ— 이뢄탐색을 μ‚¬μš©ν•œλ‹€

length 길이값에 λŒ€ν•˜μ—¬ ν•΄λ‹Ή 길이에 λ‚˜μ˜€λŠ” λžœμ„  κ°―μˆ˜κ°€ n보닀 μž‘μœΌλ©΄ 길이λ₯Ό 늘리고, 크면 길이λ₯Ό μ€„μ΄λŠ” λ°©μ‹μœΌλ‘œ 이뢄탐색을 μ§„ν–‰ν•œλ‹€.

 

이뢄탐색을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λƒμ— 따라 κ·Έ λ””ν…ŒμΌμ— 따라 λ°˜λ‘€κ°€ μƒκΈ°λ‹ˆ 잘 μ•ˆν’€λ¦°λ‹€λ©΄ μ•„λž˜ 글을 μ°Έκ³ ν•˜μž (λ°˜λ‘€λ₯Ό 정말 잘 정리해쀬닀)

https://www.acmicpc.net/board/view/124982

 

κΈ€ 읽기 - 이뢄탐색을 μ ‘κ·Όν•˜λŠ” 3가지 방법 (λ°˜λ‘€ 포함)

λŒ“κΈ€μ„ μž‘μ„±ν•˜λ €λ©΄ λ‘œκ·ΈμΈν•΄μ•Ό ν•©λ‹ˆλ‹€.

www.acmicpc.net

 

λ§Œμ•½ 47%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ λ˜λŠ” 49%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ κ°€ λœ¬λ‹€λ©΄

이뢄탐색에 μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λ“€( start, end, mid )κ³Ό 닡에 ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜μ˜ λ²”μœ„λ₯Ό ν™•μΈν•˜μž

λžœμ„ κΈΈμ΄μ˜ λ²”μœ„κ°€ 맀우 크기 λ•Œλ¬Έμ— λžœμ„ μ˜ 길이에 λŒ€μ‘ν•˜λŠ” λ³€μˆ˜λ“€(μœ„μ— λ§ν•œ 이뢄탐색에 μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λ“€κ³Ό λ‹΅ λ³€μˆ˜)은 int보닀 큰 λ²”μœ„μΈ long long으둜 λ”°λ‘œ 지정이 ν•„μš”ν•˜λ‹€

 

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int k, n;

int lan(vector<int>&v, int length) {
    int cnt=0;
    for(int i=0; i<k; i++) {
        cnt += v[i]/length;
    }
    return cnt;
}

int main() {
    cin >> k >> n;
    vector<int> v(k);
    for(int i=0; i<k; i++) {
        cin >> v[i];
    }
    
    long long ans=1;
    long long start=1, end=*max_element(v.begin(), v.end());
    while(start<=end) {
        long long mid = (start+end)/2;
        int tmp = lan(v, mid);
        if(tmp < n) {
            end = mid-1;
        } else {
            ans = max(mid, ans);
            start = mid+1;
        }
    }
    cout << ans;
}
λ°˜μ‘ν˜•