πŸ’»

[λ°±μ€€] 뢄할정볡 - 1654. λžœμ„  자λ₯΄κΈ° λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] 뢄할정볡 - 1654. λžœμ„  자λ₯΄κΈ°

λ˜νš¨λ‹ˆ 2020. 2. 12. 21:41

문제

μ§‘μ—μ„œ μ‹œκ°„μ„ λ³΄λ‚΄λ˜ μ˜€μ˜μ‹μ€ λ°•μ„±μ›μ˜ 뢀름을 λ°›κ³  κΈ‰νžˆ 달렀왔닀. 박성원이 μΊ ν”„ λ•Œ μ“Έ 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개λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λžœμ„ μ˜ μ΅œλŒ€ 길이λ₯Ό μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1

4 11
802
743
457
539

 

예제 좜λ ₯1

200

 

생각

처음으둜 μƒκ°ν•œ 것은 N을 K둜 λ‚˜λˆˆ λͺ«μœΌλ‘œ 가지고 μžˆλŠ” λžœμ„  길이 쀑 κ°€μž₯ μž‘μ€ 길이의 λžœμ„ μ„ λ‚˜λˆ„μ–΄ λ³΄μ•˜λ‹€. 

예제λ₯Ό 가지고 생각해본닀면 11/4 = 2 λ‹ˆκΉ, 457/2 = 228.

그리고 κ·Έ 수둜 λ‚˜λ¨Έμ§€ λžœμ„ λ“€μ„ μž˜λžμ„ λ•Œ λžœμ„ μ˜ κ°œμˆ˜κ°€ N보닀 큰 지 ν˜Ήμ€ μž‘μ€ 지λ₯Ό λΉ„κ΅ν•΄μ„œ λ‚˜λˆ„λŠ” 수λ₯Ό ν‚€μš°κ±°λ‚˜ 쀄인닀.

μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλŠ”λ° μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜μ™”λ‹€. 

#include <iostream>
#include <algorithm>

#define MAX 10000
using namespace std;
int n,k;
int line[MAX+1];
void Search(int divide){
    int cnt = 0;
    for(int i=0; i< k; i++){
        cnt += (line[i]/divide);
    }
    if(cnt == n){
       cout << divide <<"\n";
    }else if(cnt < n){
       divide --;
       Search(divide);
    }else if(cnt > n){
       divide ++;
       Search(divide);
    }
    return;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> k >> n;
    
    for(int i=0; i<k; i++){
        cin >> line[i];
    }
    // μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ° μœ„ν•΄ minν•¨μˆ˜μ‚¬μš©  
    int divide = *min_element(line, line+k)/ (n/k);
    
    Search(divide);
    return 0;
    
}

 

μž‘μ„±ν•œ μ½”λ“œ

#include <iostream>
#include <algorithm>

#define MAX 10000
using namespace std;
int n,k;
int line[MAX+1];

void binarySearch(long long first, long long last){
    long long result = 0;
    while(first <= last){
        long long mid = (first+last)/2;
        
        int cnt = 0;
        for(int i=0; i<k; i++){
            cnt += line[i]/mid;
        }
        
        if(cnt >= n){
            first = mid+1;
            if(result < mid){
                result = mid;
            }
        }else{
            last = mid-1;
        }
    }
    cout << result << "\n";
}

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> k >> n;
    
    for(int i=0; i<k; i++){
        cin >> line[i];
    }
      
    long long high = *max_element(line, line+k);
    
    binarySearch(1, high); //0λΆ€ν„° μ‹œμž‘ν•˜λŠ” κ²ƒμœΌλ‘œ ν•˜λ©΄ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜λ―€λ‘œ 주의!!
    return 0;
}

binarySearch(0, high)둜 ν•˜λ©΄ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜μ„œ λ„λŒ€μ²΄ μ™œ? ν–ˆλŠ”λ° 

λ§Œμ•½ μ˜ˆμ œμž…λ ₯이

1 1

이라고 ν•˜λ©΄ mid값이 0이 λ‚˜μ™€μ„œ 0으둜 λ‚˜λˆ„λŠ” κ²ƒμœΌλ‘œ λ˜κΈ°λ•Œλ¬Έμ— division by zeroκ°€ λœλ‹€. 

λ°˜μ‘ν˜•
Comments