🧩 Algorithm/[BOJ] Silver

BOJ 1654번 : λžœμ„  자λ₯΄κΈ° (C++/Silver 2)

devCloud 2022. 9. 18. 22:58
728x90
 

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쀄에 걸쳐 이미 κ°€μ§€κ³  μžˆλŠ” 각 λžœμ„ μ˜ 길이가 μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ μž…λ ₯λœλ‹€. λžœμ„ μ˜ κΈΈμ΄λŠ” 2^31-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

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


예제 μž…λ ₯

4 11
802
743
457
539

예제 좜λ ₯

200

μ„€λͺ…

802cm λžœμ„ μ—μ„œ 4개, 743cm λžœμ„ μ—μ„œ 3개, 457cm λžœμ„ μ—μ„œ 2개, 539cm λžœμ„ μ—μ„œ 2개λ₯Ό μž˜λΌλ‚΄ λͺ¨λ‘ 11개λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

풀이

μ£Όμ˜ν•  점

  • IntegerOverflow : μ •μˆ˜κ°€ μ €μž₯ν•  수 μžˆλŠ” κ°€μž₯ 큰 값보닀 더 큰 κ°’, λ˜λŠ” κ°€μž₯ μž‘μ€ 값보닀 더 μž‘μ€ 값을 μ €μž₯ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€.
  • DivisionByZero : 0으둜 λ‚˜λˆ”

Solution

#include <iostream>
using namespace std;

long long K, N, k[10000], n;
int main() {
    cin >> K >> N;
    long long max = 0;
    for(int i = 0; i < K; i++){
        cin >> k[i];
        if(k[i] > max)
            max = k[i];
    }
    long long min = 1, mid, result = 0;
    while(min <= max){
        mid = (min + max)/2;
        n = 0;
        for(int i = 0; i < K; i++)
             n += k[i]/mid;
        if(n < N){
            max = mid - 1;
        }
        else{
            min = mid + 1;
            result = mid;
        }
    }
    
    cout << result;
    return 0;
}
728x90