๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”ฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ Algorithm/โš ๏ธ ๋ฐฑ์ค€ โš ๏ธ

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - [์ด๋ถ„ ํƒ์ƒ‰] ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

by Meteora_ 2021. 3. 18.
728x90

๋‚˜๋ฌด์ž๋ฅด๊ธฐ 


 

 

์ฃผ์˜ = '๊ทธ๋ฆผ์ด ๋ฌด์„ฑ์˜ํ•ฉ๋‹ˆ๋‹ค'


๋ฌธ์ œ - 6์ค„ ์š”์•ฝ

1. ๋งˆ์„์— ๋‚˜๋ฌด ํŒŒ๋Š”๊ณณ์ด ์—†์Œ. 

2. ๋‚˜๋ฌด M(๋ฏธํ„ฐ) ํ•„์š”ํ•ด์„œ ๋ฒŒ๋ชฉํ•˜๊ธฐ๋กœํ•จ.

3. ๋ชฉ์žฌ ์ ˆ๋‹จ๊ธฐ ๊ตฌ์ž…. ๋†’์ด๊ฐ’(H) ์ž…๋ ฅํ•˜๋ฉด ๋•…์—์„œ H๋งŒํผ ์˜ฌ๋ผ๊ฐ€์„œ
ํ•œ์ค„์— ๋‚˜๋ž€ํžˆ ์žˆ๋Š” ๋‚˜๋ฌด ๋‹ค ! ์ž๋ฆ„.

4. ํฌ๊ธฐ๊ฐ€ ๋†’์ด๊ฐ’๋ณด๋‹ค Down์ธ ๋‚˜๋ฌด๋Š” ์•ˆ์ž˜๋ฆผ. ๋†’์ด๊ฐ’๋ณด๋‹ค Up ์ธ๋‚˜๋ฌด๋Š” ์ž˜๋ฆผ
(๋‹น์—ฐํ•œ์†Œ๋ฆฌ)

์˜ˆ : (๋‚˜๋ฌด 4๊ฐœ / 20m , 15m, 10m, 17m)   ๋†’์ด๊ฐ’: 15M

๋‹ต : 7M๋งŒ ์ž˜๋ ค์„œ ๋“ค๊ณ ๊ฐ.

5. ๋ฌดํ„ฑ๋Œ€๋กœ ์ž๋ฅด๋ฉด ํ™˜๊ฒฝ์ด ํŒŒ๊ดด๋˜๋‹ˆ ๋‚˜๋ฌด ํ•„์š”ํ•œ๋งŒํผ์˜ ๊ฐ€๊น๊ฒŒ ์ž๋ฅด๊ณ ์‹ถ์Œ.

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



์ž…๋ ฅ ์ฒซ์งธ์ค„ 1. ๋‚˜๋ฌด์˜ ๊ฐฏ์ˆ˜(n) 2. ํ•„์š”ํ•œ M

์ž…๋ ฅ ๋‘˜์งธ์ค„ 2. ๋‚˜๋ฌด์˜ ๋†’์ด (๊ฐฏ์ˆ˜(n)๋งŒํผ ์ž…๋ ฅ)

 

๋ฌธ์ œํ’€์ด ์š”๋ น

 

1. ์ด๋ถ„ ํƒ์ƒ‰ ์ „์กฐ ์ž‘์—…์œผ๋กœ ์†ŒํŒ…์„ ํ†ตํ•ด ๋‚˜๋ฌด ๋ฐฐ์น˜


2. ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž˜๋ผ์ง„ ๋‚˜๋ฌด๋“ค์˜ ํ•ฉ์ด

 

์ง‘์— ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด ๋†’์ด(M)๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๋Š˜๋ ค ํƒ์ƒ‰.


๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋†’์ด๋ฅผ ์ค„์—ฌ ํƒ์ƒ‰ํ•œ๋‹ค. (์ด๋ถ„ํƒ์ƒ‰)


์œ„์™€๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ ˆ๋‹จ๊ธฐ์˜ ์ตœ๋Œ€๊ฐ’์„ ํƒ์ƒ‰.

 

์ฝ”๋“œ -> 

 

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] inputArray = br.readLine().split(" ");  // ๋„์–ด ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„(์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ˆซ์ž๋„ฃ๊ธฐ์œ„ํ•ด) ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
        
        int treeCount = Integer.parseInt(inputArray[0]); // ๋‚˜๋ฌด์˜ ์ˆ˜ 
        int minLengthTree = Integer.parseInt(inputArray[1]); // ์ ์–ด๋„ ๊ฐ€์ ธ๊ฐ€์•ผํ•  ๋‚˜๋ฌด์˜ ๊ธธ์ด
        
        
        String[] preTreeArray = br.readLine().split(" "); // ์œ„์™€ ๋™์ผ
        int[] treeArray = new int[treeCount]; // ๋‚˜๋ฌด ๋†’์ด๋“ค์˜ ๋ฐฐ์—ด
        for(int i=0; i<preTreeArray.length; i++){
            treeArray[i] = Integer.parseInt(preTreeArray[i]);
        }
        Arrays.sort(treeArray); // ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
        int lastInt = treeArray[treeCount-1];
        
        int maxHeight = lastInt; // ํ†ฑ๋‚ ์˜ ์ตœ๋Œ€ ๋†’์ด
        int minHeight = 0; // ํ†ฑ๋‚ ์˜ ์ตœ์†Œ ๋†’์ด
        int middle = 0;    
        
        while(maxHeight >= minHeight){
            middle = (minHeight+maxHeight)/2;
            
            int cutTree = 0; // ํ†ฑ๋‚ ๋กœ ๋‚˜๋ฌด๋ฅผ ์ž˜๋ž์„ ๋•Œ ๋‚จ์€ ๋‚˜๋ฌด ๊ธธ์ด ๋ณ€์ˆ˜
            long sumCutTree = 0; // ์ž˜๋ผ๋‚ธ ๋‚˜๋ฌด ๊ธธ์ด๋“ค์˜ ํ•ฉ, long์„ ์„ ์–ธํ•œ ์ด์œ ๋Š” ํ•ฉ์ด int ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.
            
            for(int j=0; j<treeArray.length; j++){
                
                cutTree = treeArray[j] - middle; // ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ ์ ˆํ•œ ํ†ฑ๋‚ ์˜ ๋†’์ด๋ฅผ ์ฐพ์•„๊ฐ„๋‹ค. ์ค‘๊ฐ„ ๊ฐ’์œผ๋กœ ๋‚˜๋ฌด๋“ค์„ ์ž˜๋ผ๋ณด๊ณ 
                                                 // ๋ฒ”์œ„๋ฅผ ์ขํ˜€๋‚˜๊ฐ„๋‹ค.
                
                if(cutTree <0){
                    cutTree = 0; // ์ž˜๋ฆฐ๊ฒŒ ์—†์œผ๋ฉด 0์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ด๋„ˆ์Šค ๊ฐ’์€ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.
                }
                sumCutTree += cutTree;
            }
            
            if(sumCutTree >= minLengthTree){ // ํ†ฑ์œผ๋กœ ์ž˜๋ผ๋‚ธ ๋‚˜๋ฌด ๊ธธ์ด๋“ค์˜ ํ•ฉ์ด ์ตœ์†Œํ•œ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€์•ผ๋˜๋Š” ๋‚˜๋ฌด ๊ธธ์ด๋ณด๋‹ค ํด ๋•Œ
                
                minHeight = middle + 1; // ํ™˜๊ฒฝ์„ ์ƒ๊ฐํ•ด์„œ ๋”ฑ ๋งž์ถฐ ์ž˜๋ผ๊ฐ€๋ ค๋ฉด ํ†ฑ๋‚ ์˜ ๋†’์ด๋ฅผ ๋†’์—ฌ์„œ ๋‚˜๋ฌด๋ฅผ ์กฐ๊ธˆ๋งŒ ์ž˜๋ผ๊ฐ€์•ผ ํ•œ๋‹ค.
                
            }else if(sumCutTree < minLengthTree){ // ํ†ฑ์œผ๋กœ ์ž˜๋ผ๋‚ธ ๋‚˜๋ฌด ๊ธธ์ด๋“ค์˜ ํ•ฉ์ด ์ตœ์†Œํ•œ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€์•ผ ๋˜๋Š” ๋‚˜๋ฌด ๊ธธ์ด๋ณด๋‹ค ์ž‘์„ ๋•Œ
                
                maxHeight = middle - 1; // ํ•„์š”ํ•œ ๋‚˜๋ฌด๊ธธ์ด๋ณด๋‹ค ์ž˜๋ผ๋‚ธ ๋‚˜๋ฌด ๊ธธ์ด๋“ค์˜ ํ•ฉ์ด ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ํ†ฑ๋‚ ์˜ ๋†’์ด๋ฅผ ๋‚ฎ์ถฐ์„œ ๋” ๊ธธ๊ฒŒ ๋ฒ ์–ด์•ผ ํ•œ๋‹ค.
                
            }
            
        }
        
        System.out.println(maxHeight);    // ํ†ฑ๋‚ ์˜ ๋†’์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์—์„œ ์ตœ๋Œ€๊ฐ’
    }    
 
}

๋Œ“๊ธ€