ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณ ๋“์  kit ๊ตฌ๋ช…๋ณดํŠธ
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/Programmers 2020. 7. 8. 20:01

    ๋ฌธ์ œ ์„ค๋ช…

    ๋ฌด์ธ๋„์— ๊ฐ‡ํžŒ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์ถœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ช…๋ณดํŠธ๋Š” ์ž‘์•„์„œ ํ•œ ๋ฒˆ์— ์ตœ๋Œ€ 2๋ช…์”ฉ ๋ฐ–์— ํƒˆ ์ˆ˜ ์—†๊ณ , ๋ฌด๊ฒŒ ์ œํ•œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์˜ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ [70kg, 50kg, 80kg, 50kg]์ด๊ณ  ๊ตฌ๋ช…๋ณดํŠธ์˜ ๋ฌด๊ฒŒ ์ œํ•œ์ด 100kg์ด๋ผ๋ฉด 2๋ฒˆ์งธ ์‚ฌ๋žŒ๊ณผ 4๋ฒˆ์งธ ์‚ฌ๋žŒ์€ ๊ฐ™์ด ํƒˆ ์ˆ˜ ์žˆ์ง€๋งŒ 1๋ฒˆ์งธ ์‚ฌ๋žŒ๊ณผ 3๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ๋ฌด๊ฒŒ์˜ ํ•ฉ์€ 150kg์ด๋ฏ€๋กœ ๊ตฌ๋ช…๋ณดํŠธ์˜ ๋ฌด๊ฒŒ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์—ฌ ๊ฐ™์ด ํƒˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ตฌ์ถœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ๋žŒ๋“ค์˜ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด people๊ณผ ๊ตฌ๋ช…๋ณดํŠธ์˜ ๋ฌด๊ฒŒ ์ œํ•œ limit๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ตฌ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ตฌ๋ช…๋ณดํŠธ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

     

    ์ œํ•œ์‚ฌํ•ญ

    • ๋ฌด์ธ๋„์— ๊ฐ‡ํžŒ ์‚ฌ๋žŒ์€ 1๋ช… ์ด์ƒ 50,000๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.

    • ๊ฐ ์‚ฌ๋žŒ์˜ ๋ชธ๋ฌด๊ฒŒ๋Š” 40kg ์ด์ƒ 240kg ์ดํ•˜์ž…๋‹ˆ๋‹ค.

    • ๊ตฌ๋ช…๋ณดํŠธ์˜ ๋ฌด๊ฒŒ ์ œํ•œ์€ 40kg ์ด์ƒ 240kg ์ดํ•˜์ž…๋‹ˆ๋‹ค.

    • ๊ตฌ๋ช…๋ณดํŠธ์˜ ๋ฌด๊ฒŒ ์ œํ•œ์€ ํ•ญ์ƒ ์‚ฌ๋žŒ๋“ค์˜ ๋ชธ๋ฌด๊ฒŒ ์ค‘ ์ตœ๋Œ“๊ฐ’๋ณด๋‹ค ํฌ๊ฒŒ ์ฃผ์–ด์ง€๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌ์ถœํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

     

    ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„ (20์ )

    import java.util.Arrays;
    import java.util.ArrayList;
    import java.util.stream.Collectors;
    
    class Solution {
        public int solution(int[] people, int limit) {
            int numBoats = 0;
            
            //init
            ArrayList<Integer> peopleList = Arrays.stream(people)
                                                .boxed()
                                                .collect(Collectors.toCollection(ArrayList::new));
            
            while(!peopleList.isEmpty()) {
                int personWeight = peopleList.remove(0);
                
                for(int i = 0; i < peopleList.size(); i++) {
                    if(personWeight + peopleList.get(i) <= limit) { //total <= limit
                        peopleList.remove(i);
                        break;
                    }
                }
                    
                numBoats++;
            }
            
            
            return numBoats;
        }
    }

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„(์ •ํ™•์„ฑ : 75, ํšจ์œจ์„ฑ : 0)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] people, int limit) {
            int numBoat = 0;
            int numPassenger = 0;
            int n = people.length;
            boolean twoOnBoard;
            boolean[] saved = new boolean[n]; // default : false
            
            Arrays.sort(people);
            
            for(int i = n-1; i >= 0; i--) {
                if(saved[i]) continue;
                
                saved[i] = true; // ith man on board
                twoOnBoard = false;
                
                for(int j = i-1; j >= 0; j--) {
                     if(!saved[j] && people[i] + people[j] <= limit) {
                         saved[j] = true; // jth man on board
                         twoOnBoard = true;
                         numBoat++;
                         break;
                     }
                }
                
                if(!twoOnBoard) numBoat++;
            }
            
            return numBoat;
        }
    }

     

    ์„ธ๋ฒˆ์งธ ์‹œ๋„(์ •ํ™•์„ฑ : 75, ํšจ์œจ์„ฑ : 0)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] people, int limit) {
            int numPassenger = 0;
            int n = people.length;
            int numBoat = n;
            boolean[] saved = new boolean[n]; // default : false
            
            Arrays.sort(people);
            
            for(int i = n-1; i >= 0; i--) {
                if(saved[i]) continue;
                
                saved[i] = true; // ith man on board
                
                for(int j = i-1; j >= 0; j--) {
                     if(!saved[j] && people[i] + people[j] <= limit) {
                         saved[j] = true; // jth man on board
                         numBoat--;
                         break;
                     }
                }
            }
            
            return numBoat;
        }
    }

     

    ๋„ค๋ฒˆ์งธ ์‹œ๋„(์ •ํ™•์„ฑ : 75, ํšจ์œจ์„ฑ : 0)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] people, int limit) {
            int n = people.length;
            int numBoat = n;
            int lightestIdx = 0;
            int lightest, heaviest;
            
            Arrays.sort(people);
            
            for(heaviest = n-1; heaviest >= 0; heaviest--) {
                if(lightestIdx == heaviest) break; // no man to save
                
                for(lightest = lightestIdx; lightest < heaviest; lightest++) {
                    if(people[heaviest] + people[lightest] <= limit) {
                        lightestIdx++;
                        numBoat--;
                        break;
                    }
                }
            }
            
            return numBoat;
        }
    }

     

    ์ตœ์ข… ์ฝ”๋“œ(100์ ๐Ÿ˜ญ)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] people, int limit) {
            int n = people.length;
            int numBoat = n;
            int lightest = 0, heaviest = n - 1;
            
            Arrays.sort(people);
            
            while(lightest < heaviest) {
                // no man is able to ride with the heaviest man
                if(people[lightest] + people[heaviest] > limit) { 
                    heaviest--;
                    continue;
                }
                // The heaviest and the lightest are able to ride together
                else { 
                    heaviest--;
                    lightest++;
                    
                    numBoat--;
                }            
            }
            
            return numBoat;
        }
    }

     

    ์™œ ์ €๋ ‡๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„

    ๋ฌธ์ œ๋ฅผ ์ฒœ์ฒœํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ฒฐ๊ตญ ๋ˆ„๊ฐ€ ๋จผ์ € ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ํƒ€๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ํƒ€๋Š” pair๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์˜ ๋ฌด๊ฒŒ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด people์„ arraylist์— ์ €์žฅํ•ด์„œ ์ง์„ ์ฐพ์œผ๋ฉด ์ง๊ณผ ํ•จ๊ป˜ arraylist์—์„œ ์‚ญ์ œํ•˜๊ณ  ์ง์„ ์ฐพ์ง€ ๋ชป ํ•˜๋ฉด ์ž๊ธฐ ํ˜ผ์ž๋งŒ ์‚ญ์ œ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„

    ์ฒซ๋ฒˆ์งธ ์‹คํŒจ ํ›„ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ด ๋ฌธ์ œ๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„์— ๋ฐฐ์šด Knapsack problem๊ณผ ๋‹ฎ์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” Knapsack problem์˜ ํ•ต์‹ฌ์€ '๊ฝ‰๊ฝ‰ ์ฑ„์›Œ ๋„ฃ๊ธฐ'์˜€๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ๋ช…๋ณดํŠธ์— ๊ฝ‰๊ฝ‰ ์ฑ„์›Œ๋„ฃ๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ ํ•˜๋‚˜์™€ ๊ทธ ์‚ฌ๋žŒ๋ณด๋‹ค ๋œ ๋ฌด๊ฑฐ์šด ์ˆœ์„œ๋กœ ์ญ‰ ํ›‘์–ด๋ณด๋ฉด์„œ ์ง์„ ์ฐพ๊ธฐ๋กœ ํ–ˆ๋‹ค.

    ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •ํ™•ํ–ˆ์œผ๋‚˜ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

     

    ์„ธ๋ฒˆ์งธ ์‹œ๋„

    ๋‘๋ฒˆ์งธ ์‹คํŒจ ํ›„ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์ด ์›์ธ์ผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ ๋ณ€์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ณ ๋ฏผํ•˜๋˜ ์ค‘ ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ•œ ์‚ฌ๋žŒ๋‹น ํ•˜๋‚˜์˜ ๋ณดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ ์ผ๋‹จ ๋ณดํŠธ๋ฅผ ์‚ฌ๋žŒ์˜ ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋‘ ์‚ฌ๋žŒ์ด ๊ตฌ๋ช…๋ณดํŠธ์— ํƒ‘์Šนํ•  ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ๋ณดํŠธ์˜ ์ˆ˜๋ฅผ ์ค„์ด๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

    ๋‘๋ฒˆ์งธ ์‹œ๋„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •ํ™•ํ–ˆ์œผ๋‚˜ ์‹œ๊ฐ„์ด ๋ฌธ์ œ์˜€๋‹ค.

     

    ๋„ค๋ฒˆ์งธ ์‹œ๋„

    ์„ธ๋ฒˆ์งธ ์‹คํŒจ ํ›„ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ '๊ฝ‰๊ฝ‰ ์ฑ„์›Œ๋„ฃ๊ธฐ'๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๊ณผ ๊ทธ ์‚ฌ๋žŒ๋ณด๋‹ค ๋œ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ๊ฐ ์‚ฌ๋žŒ์˜ ๊ตฌ์กฐ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” saved๋ผ๋Š” boolean ํƒ€์ž…์˜ ๋ฐฐ์—ด๋„ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

    ์„ธ๋ฒˆ์งธ ์‹œ๋„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •ํ™•ํ–ˆ์œผ๋‚˜ ์—ฌ์ „ํžˆ ๋Š๋ ธ๋‹ค.

     

    ์ตœ์ข… ์„ฑ๊ณต

    ๋„ค๋ฒˆ์งธ ์‹คํŒจ ํ›„ ๊ณ„์† ์ƒ๊ฐํ–ˆ๋‹ค.

    '์ •๋ ฌ ํ›„ ์‹œ๊ฐ„๋ณต์žก๋„ O(n) ์•ˆ์— ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?'

     

    ๊ทธ ๋•Œ ๋งˆ์นจ ์–ผ๋งˆ ์ „ ๊ธฐ์‚ฌ์—์„œ ์ฐพ์•„๋ณธ two-pointer ๊ธฐ๋ฒ•์ด ๋– ์˜ฌ๋ž๋‹ค.

    Two pointer ๊ธฐ๋ฒ•์˜ ํ•ต์‹ฌ์€ '์ •๋ ฌ๋œ ์ˆซ์ž๋“ค ์–‘ ๋์— ๋‘ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๊ฐ€๋ฆฌํ‚จ ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๊ฐ’๋“ค์˜ ๊ณฑ/ ํ•ฉ/ ์ฐจ ๋“ฑ์ด ๋‚ดํฌํ•˜๋Š” ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•ด์„œ ๊ฐ€๋ฆฌํ‚จ ๋ฐฉํ–ฅ์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ'์ด๋‹ค.

     

    ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ •๋ ฌ์„ ํ•˜๋ฉด ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ์ด ์˜ค๋ฅธ์ชฝ์—, ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ์ด ์™ผ์ชฝ์œผ๋กœ ์˜ค๊ฒŒ ๋œ๋‹ค.

    ๋งŒ์•ฝ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ์˜ ๋ฌด๊ฒŒ ํ•ฉ์ด limit๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ๋‚ดํฌํ•˜๋Š” ์˜๋ฏธ๋Š” '๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ™์ด ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์—†๋‹ค'์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ๋„ ๊ฐ™์ด ๋ชป ํƒ€๋Š”๋ฐ ๊ทธ ์‚ฌ๋žŒ๋ณด๋‹ค ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๋“ค์€ ๋‹น์—ฐํžˆ ํƒˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    ๊ฐ™์€ ๋…ผ๋ฆฌ๋กœ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ์˜ ๋ฌด๊ฒŒ ํ•ฉ์ด limit๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ทธ๊ฒƒ์ด ๋‚ดํฌํ•˜๋Š” ์˜๋ฏธ๋Š” '๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์‚ฌ๋žŒ๊ณผ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์‚ฌ๋žŒ์€ ๊ฐ™์ด ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.'์ด๋‹ค.

     

    ์ด ๋‘๊ฐ€์ง€๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋Š” ๋Œ€์„ฑ๊ณต ๐Ÿ˜ญ

     

    ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜

    ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋˜ ์ƒ๊ฐํ•˜๋Š” ์—ฐ์Šต์„ ํ–ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์“ฐ์ด๋Š” ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ๊ธฐ์˜๋‹ค. ๐Ÿ˜„

    ๋Œ“๊ธ€

Designed by Tistory.