ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] 2019 ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ๋ฆฌํฌ๋ฃจํŒ… ์‹คํŒจ์œจ
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/others 2020. 7. 4. 22:44

    ๋ฌธ์ œ ์„ค๋ช…

    ์Šˆํผ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž ์˜ค๋ ๋ฆฌ๋Š” ํฐ ๊ณ ๋ฏผ์— ๋น ์กŒ๋‹ค. ๊ทธ๋…€๊ฐ€ ๋งŒ๋“  ํ”„๋žœ์ฆˆ ์˜ค์ฒœ์„ฑ์ด ๋Œ€์„ฑ๊ณต์„ ๊ฑฐ๋’€์ง€๋งŒ, ์š”์ฆ˜ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์˜ ์ˆ˜๊ฐ€ ๊ธ‰๊ฐํ•œ ๊ฒƒ์ด๋‹ค. ์›์ธ์€ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์™€ ๊ธฐ์กด ์‚ฌ์šฉ์ž ์‚ฌ์ด์— ์Šคํ…Œ์ด์ง€ ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ํฐ ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

    ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ ๊ณ ๋ฏผ ํ•œ ๊ทธ๋…€๋Š” ๋™์ ์œผ๋กœ ๊ฒŒ์ž„ ์‹œ๊ฐ„์„ ๋Š˜๋ ค์„œ ๋‚œ์ด๋„๋ฅผ ์กฐ์ ˆํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์—ญ์‹œ ์Šˆํผ ๊ฐœ๋ฐœ์ž๋ผ ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์€ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์‹คํŒจ์œจ์„ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์œ„๊ธฐ์— ๋น ์ง€๊ณ  ๋ง์•˜๋‹ค. ์˜ค๋ ๋ฆฌ๋ฅผ ์œ„ํ•ด ์‹คํŒจ์œจ์„ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜๋ผ.

     

    • ์‹คํŒจ์œจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

      • ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ–ˆ์œผ๋‚˜ ์•„์ง ํด๋ฆฌ์–ดํ•˜์ง€ ๋ชปํ•œ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜ / ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ•œ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜

     

    ์ „์ฒด ์Šคํ…Œ์ด์ง€์˜ ๊ฐœ์ˆ˜ N, ๊ฒŒ์ž„์„ ์ด์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ๋ฉˆ์ถฐ์žˆ๋Š” ์Šคํ…Œ์ด์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด stages๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์‹คํŒจ์œจ์ด ๋†’์€ ์Šคํ…Œ์ด์ง€๋ถ€ํ„ฐ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์Šคํ…Œ์ด์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐฐ์—ด์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜๋ผ.

     

    ์ œํ•œ์‚ฌํ•ญ

    • ์Šคํ…Œ์ด์ง€์˜ ๊ฐœ์ˆ˜ N์€ 1 ์ด์ƒ 500 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

    • stages์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 200,000 ์ดํ•˜์ด๋‹ค.

    • stages์—๋Š” 1 ์ด์ƒ N + 1 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.

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

      • ๋‹จ, N + 1 ์€ ๋งˆ์ง€๋ง‰ ์Šคํ…Œ์ด์ง€(N ๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€) ๊นŒ์ง€ ํด๋ฆฌ์–ด ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

    • ๋งŒ์•ฝ ์‹คํŒจ์œจ์ด ๊ฐ™์€ ์Šคํ…Œ์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž‘์€ ๋ฒˆํ˜ธ์˜ ์Šคํ…Œ์ด์ง€๊ฐ€ ๋จผ์ € ์˜ค๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

    • ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ•œ ์œ ์ €๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์Šคํ…Œ์ด์ง€์˜ ์‹คํŒจ์œจ์€ 0 ์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

     

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

    import java.util.ArrayList;
    import java.util.Comparator;
    
    class FailureOfStage {
        public int stage;
        public double failure;
        
        public FailureOfStage(int stage, double failure) {
            this.stage = stage;
            this.failure = failure;
        }
        
        public int getStage() { return stage; }
        public double getFailure() { return failure; }
    }
    
    class Solution {
        public int[] solution(int N, int[] stages) {
            int[] answer;
            int numTotalPlayer = stages.length;
            int[] numStageClearPlayer = new int[N + 1];
            ArrayList<FailureOfStage> failureOfStages = new ArrayList<>();
            int numChallenger = 0;
            
            for(int challengingStage : stages) {
                numStageClearPlayer[challengingStage - 1]++;
            }
            
            for(int i = 0; i < N; i++) {
                int stage = i + 1;
                double failure = (numTotalPlayer == numChallenger) ? 0 : (double) numStageClearPlayer[i] / (numTotalPlayer - numChallenger);
                
                failureOfStages.add(new FailureOfStage(stage, failure));
                
                numChallenger += numStageClearPlayer[i];
            }
    
            failureOfStages.sort(Comparator.comparing(FailureOfStage::getFailure).reversed().thenComparing(FailureOfStage::getStage));
            
            answer = failureOfStages.stream().mapToInt(FailureOfStage::getStage).toArray();
             
            return answer;
        }
    }

     

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

    ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ stage์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” N๊ณผ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋„์ „ ์ค‘์ธ stage์ธ 1์ฐจ์› ๋ฐฐ์—ด stages ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ stages์—์„œ N + 1์ด ์ฃผ์–ด์ง€๋ฉด N๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๊นŒ์ง€ ๋ชจ๋‘ ํด๋ฆฌ์–ดํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

     

    ์ฒœ์ฒœํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ n๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๋ฅผ ๋„์ „ ์ค‘์ด๋ผ๋Š” ๋ง์€ n-1๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๊นŒ์ง€๋Š” ํด๋ฆฌ์–ดํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    (n๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€ ๋„์ „ ์ค‘) = (n-1๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๊นŒ์ง€๋Š” ํด๋ฆฌ์–ด)

     

    ๊ทธ๋ž˜์„œ ๊ฐ ์Šคํ…Œ์ด์ง€๋ณ„ ํด๋ฆฌ์–ดํ•œ ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ํฌ๊ธฐ๊ฐ€ N + 1์ธ ๋ฐฐ์—ด์„ ๋งŒ๋“  ๋’ค stages๋ฅผ traverseํ•˜์—ฌ ์ด๋ฅผ ํŒŒ์•…ํ–ˆ๋‹ค. ๊ด€๋ จ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    		...
    int[] numStageClearPlayer = new int[N + 1];
    		…
    for(int challengingStage : stages) {
    	 numStageClearPlayer[challengingStage - 1]++;
    }
    

     

    ๋‹ค์Œ์œผ๋กœ ๊ฐ ์Šคํ…Œ์ด์ง€๋ณ„ ์‹คํŒจ์œจ์„ ๊ตฌํ•˜๋Š”๋ฐ ์‹คํŒจ์œจ์˜ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ–ˆ์œผ๋‚˜ ์•„์ง ํด๋ฆฌ์–ดํ•˜์ง€ ๋ชปํ•œ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜ / ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ•œ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜

     

    ์ด๋ฅผ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    i๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๋ฅผ ๋„์ „ ์ค‘์ธ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜ / i๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€์— ๋„๋‹ฌํ•œ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜

     

    ์ด๋ฅผ ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    (i-1)๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๋ฅผ ํด๋ฆฌ์–ดํ•œ ์‚ฌ๋žŒ์˜ ์ˆ˜ / (์ „์ฒด ํ”Œ๋ ˆ์ด์–ด ์ˆ˜ - (i - 1) ๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€๋ฅผ ๋„์ „ ์ค‘์ธ ์‚ฌ๋žŒ์˜ ์ˆ˜)

     

    ๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์€ ์‹คํŒจ์œจ์ด ๋‚ฎ์€ ์ˆœ์„œ๋กœ ์Šคํ…Œ์ด์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹คํŒจ์œจ์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์Šคํ…Œ์ด์ง€๊ฐ€ ๋†’์€ ์ˆœ์„œ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ์ด๋ฅผ ์œ„ํ•ด ์‹คํŒจ์œจ๊ณผ ์Šคํ…Œ์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” FailureOfStage๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹คํŒจ์œจ์„ ๊ณ„์‚ฐํ•œ ๋’ค FailureOfStage๋ฅผ ์ €์žฅํ•˜๋Š” ArrayList์— ์ €์žฅํ–ˆ๋‹ค. ๊ด€๋ จ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    int numTotalPlayer = stages.length;
    ArrayList<FailureOfStage> failureOfStages = new ArrayList<>();
    int numChallenger = 0;
    	…
     for(int i = 0; i < N; i++) {
     	int stage = i + 1;
        double failure = (numTotalPlayer == numChallenger) ? 0 : (double) numStageClearPlayer[i] / (numTotalPlayer - numChallenger);
                
    	failureOfStages.add(new FailureOfStage(stage, failure));
        
        numChallenger += numStageClearPlayer[i];
    }

     

    ๊ทธ ๋’ค๋กœ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ์‹คํŒจ์œจ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ, ์‹คํŒจ์œจ์ด ๊ฐ™์œผ๋ฉด ์Šคํ…Œ์ด์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค arraylist์—์„œ stage๋ฅผ ๋ฝ‘์€ ๋‹ค์Œ array์— ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค. ๊ด€๋ จ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    failureOfStages.sort(Comparator.comparing(FailureOfStage::getFailure).reversed().thenComparing(FailureOfStage::getStage));
            
    answer = failureOfStages.stream().mapToInt(FailureOfStage::getStage).toArray();

     

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

    ์ด ๋ฌธ์ œ๋Š” ์ง€๋ฌธ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ฒœ์ฒœํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฌธ์ œ์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฒœ์ฒœํžˆ ๊ทธ๋ฆฌ๊ณ  ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

     

    ๋˜ํ•œ Comparator๋ผ๋Š” class์—์„œ static method๋กœ ์ œ๊ณตํ•˜๋Š” comparing๊ณผ thenComparing์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ๊ธฐ์กด์— ๋žŒ๋‹ค์‹์œผ๋กœ compare๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๊ณ  ํŽธ๋ฆฌํ–ˆ๋‹ค. ์•ž์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค.

    ๋Œ“๊ธ€

Designed by Tistory.