๐Ÿงฉ Algorithm/[BOJ] Silver

BOJ 2805๋ฒˆ : ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ (C/Silver 2)

devCloud 2022. 7. 22. 18:30
728x90

2805๋ฒˆ: ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 1,000,000, 1 โ‰ค M โ‰ค 2,000,000,000) ๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด

www.acmicpc.net

๋ฌธ์ œ
์ƒ๊ทผ์ด๋Š” ๋‚˜๋ฌด M๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋จผ์ €, ์ƒ๊ทผ์ด๋Š” ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ†ฑ๋‚ ์ด ๋•…์œผ๋กœ๋ถ€ํ„ฐ H๋ฏธํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ทธ ๋‹ค์Œ, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๋ชจ๋‘ ์ ˆ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ, ๋†’์ด๊ฐ€ H๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋Š” H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋‚˜๋ฌด๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ 20, 15, 10, 17์ด๋ผ๊ณ  ํ•˜์ž. ์ƒ๊ทผ์ด๊ฐ€ ๋†’์ด๋ฅผ 15๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, ๋‚˜๋ฌด๋ฅผ ์ž๋ฅธ ๋’ค์˜ ๋†’์ด๋Š” 15, 15, 10, 15๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ƒ๊ทผ์ด๋Š” ๊ธธ์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด์™€ 2์ธ ๋‚˜๋ฌด๋ฅผ ๋“ค๊ณ  ์ง‘์— ๊ฐˆ ๊ฒƒ์ด๋‹ค. (์ด 7๋ฏธํ„ฐ๋ฅผ ์ง‘์— ๋“ค๊ณ  ๊ฐ„๋‹ค) ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋Š” ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
์ƒ๊ทผ์ด๋Š” ๋‚˜๋ฌด๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 1,000,000, 1 โ‰ค M โ‰ค 2,000,000,000)
๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ๊ทผ์ด๋Š” ์ง‘์— ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ฅผ ํ•ญ์ƒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋†’์ด๋Š” 1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ถœ๋ ฅ
์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ ์ž…๋ ฅ

4 7
20 15 10 17

์˜ˆ์ œ ์ถœ๋ ฅ

15

์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

5 2000000000
900000000 900000000 900000000 900000000 900000000
๊ฒฐ๊ณผ : 500000000

๋ฌธ์ œ ์„ค๋ช…


๋ฌธ์ œ ํ’€์ด

  1. ์ œ์ผ ํฐ ๋‚˜๋ฌด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ถ„ํƒ์ƒ‰์„ ํ•œ๋‹ค. (๊ทธ๋Ÿผ ํฐ ๋‚˜๋ฌด๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค.)
  2. ์ œ์ผ ํฐ ๋‚˜๋ฌด๊ฐ€ ๋งŒ์ผ 20์ด๋ฉด ์ค‘๊ฐ„๊ฐ’์ด 10์ด๋ฏ€๋กœ, ๋‚˜๋ฌด๋“ค์„ 10m๋กœ ์ž๋ฅธ๋‹ค.
  3. ๊ทธ๋Ÿผ ๊ฐ€์ ธ๊ฐ€๋ ค๋Š” ๋‚˜๋ฌด๊ฐ€ 22๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์›๋ž˜ ๊ฐ€์ ธ๊ฐ€๋ ค๋Š” ๋‚˜๋ฌด๋Š” 7์ด๋‹ค. ์›ํ•˜๋Š” ๊ธธ์ด๋ณด๋‹ค ๋” ๊ฐ€์ ธ๊ฐ€๋ฏ€๋กœ 10m๋ณด๋‹ค ๋” ๋งŽ์ด ์ž˜๋ผ์•ผ ํ•œ๋‹ค.
  4. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 11~20๊นŒ์ง€ ๋‹ค์‹œ ์ด๋ถ„ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
  5. ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ณ , ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์œผ๋ฉด ์ถœ๋ ฅํ•œ๋‹ค.

Solution

#include <stdio.h>
int N, M; //๋‚˜๋ฌด ๊ฐœ์ˆ˜, ๊ธธ์ด
long long H[1000001]; //๋‚˜๋ฌด ๋†’์ด
long long start, end, min, tree=0, result;

int main() {
    scanf("%d %d",&N, &M); 
    for(int i=0; i < N; i++){
        scanf("%lld",&H[i]);
    }
    //end = H[0]; //๋‚˜๋ฌด ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ
    for(int i = 0; i < N; i++){
        if(H[i] >= end) end = H[i];
    }
    //์ตœ๋Œ€๊ฐ’์„ ์ฐพ์•˜์œผ๋‹ˆ ์ด๋ถ„ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
    while(start <= end){
        min = (start + end)/2;
        tree = 0;
        //์ „์ฒด ๋‚˜๋ฌด๋ฅผ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ์ž๋ฅด๊ธฐ
        for(int i=0; i < N; i++){
            if(H[i] > min){
              tree += (H[i] - min); //์ž๋ฅธ ๋‚˜๋ฌด ๋‹ค ๋”ํ•˜๊ธฐ
            }
        }
        //์ •๋‹ต์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธ
        if(M <= tree && min > result){
              result = min;
        }
        if(M > tree)
            end = min - 1;
        else
            start = min + 1;
    }
    printf("%lld\n",result);
    return 0;
}
728x90