Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ณผ์ œ ์ง„ํ–‰ํ•˜๊ธฐ

giraffe_ 2023. 7. 26. 00:23

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

 

 

 

๋ฌธ์ œ

  • ๊ณผ์ œ ๊ณ„ํš์„ ๋‹ด์€ ์ด์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด plans๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ณผ์ œ๋ฅผ ๋๋‚ธ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฆ„์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return
    • plans์˜ ์›์†Œ๋Š” [name, start, playtime]์˜ ๊ตฌ์กฐ
    • name : name์ด ์ค‘๋ณต๋˜๋Š” ์›์†Œ๋Š” ์—†์Œ
    • start : "hh:mm"์˜ ํ˜•ํƒœ
    • playtime : ๋‹จ์œ„๋Š” ๋ถ„
  • ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•  ์‹œ๊ฐ์ด ๋˜์—ˆ์„ ๋•Œ, ์ง„ํ–‰ ์ค‘์ด๋˜ ๊ณผ์ œ๋ฅผ ๋ฉˆ์ถ”๊ณ  ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์‹œ์ž‘
  • ๊ณผ์ œ๋ฅผ ๋๋ƒˆ์„ ๋•Œ, ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๋ฅผ ์ด์–ด์„œ ์ง„ํ–‰
    • ๋งŒ์•ฝ, ๊ณผ์ œ๋ฅผ ๋๋‚ธ ์‹œ๊ฐ์— ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ๋˜๋Š” ๊ณผ์ œ์™€ ์ž ์‹œ ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๊ฐ€ ๋ชจ๋‘ ์žˆ๋‹ค๋ฉด, ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๋ถ€ํ„ฐ ์ง„ํ–‰
  • ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฉˆ์ถ˜ ๊ณผ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

  • Plans : [["science", "12:40", "50"], ["music", "12:20", "40"], ["history", "14:00", "30"], ["computer", "12:30", "100"]]
  • result : ["science", "history", "computer", "music"]

 

 

 

 

 

ํ’€์ด

  • class (name, start, playtime) ๋งŒ๋“ค์–ด์„œ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
    • start : ๊ณ„์‚ฐํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•ด์„œ ๋ถ„(int)์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
  • ์‹œ์ž‘์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์‹œ์ž‘
  • ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฉˆ์ถ˜ ๊ณผ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง„ํ–‰์ค‘ ๊ณผ์ œ๋ฅผ Stack์— ์ €์žฅ
    • ์Šคํƒ์— ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ ๋„ฃ๊ณ  ์‹œ์ž‘
    • ๋‹ค์Œ ๊ณผ์ œ ์‹œ์ž‘ ์ „๊นŒ์ง€ ์Šคํƒ์—์„œ ๊ณผ์ œ ๋นผ์„œ ๋งˆ์นจ
    • ๊ณผ์ œ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋˜๋ฉด, ์Šคํƒ์— ๋ชป ๋งˆ์นœ ๊ณผ์ œ์˜ playtime์„ ๋‚จ์€ ์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ํ•ด์„œ ๋„ฃ์Œ -> ๊ทธ๋ฆฌ๊ณ  ์ค‘๋‹จ
    • ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์ œ ๋•Œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๋Š” ๋๋‚จ
    • ์Šคํƒ์— ๋‚จ์•„์žˆ๋Š” ์ž”์—ฌ ๊ณผ์ œ๋“ค์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰
  • ๊ฒฐ๊ณผ๋Š” List์— ์ €์žฅ ํ›„, return ์‹œ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜

 

 

 

์Šคํƒ ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ์—์„œ ์ •ํ•ด์ง„ ๊ณผ์ •์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.util.*;

class Solution {
    public class Plan {
        String name;
        int start, playtime;
        
        public Plan(String name, int start, int playtime) {
            this.name = name;
            this.start = start;
            this.playtime = playtime;
        }
        
        public int getStart() {
            return start;
        }
    }
    
    
    public String[] solution(String[][] plans) {
        List<Plan> planList = new ArrayList<>(); //Plan ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ
        
        for(String[] plan : plans) {
            planList.add(new Plan(plan[0], startToMin(plan[1]), Integer.parseInt(plan[2]) ));
        }
        
        //์‹œ์ž‘์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์‹œ์ž‘
        Collections.sort(planList, (p1, p2) -> p1.getStart() - p2.getStart());
        
        Stack<Plan> stack = new Stack<>(); //๊ณผ์ œ ๋Œ€๊ธฐ์—ด
        List<String> result = new ArrayList<>(); //๊ฒฐ๊ณผ
        
        for(int i = 0; i < planList.size(); i++) {
            int now = planList.get(i).start;
            int next = 0;
            if(i != planList.size() - 1)  {
                next = planList.get(i + 1).start;
            }
            
            stack.add(planList.get(i));
            
            while(!stack.isEmpty()) {
                Plan p = stack.pop();
                
                if(now + p.playtime <= next) {
                    now += p.playtime; //ํ˜„์žฌ ์‹œ๊ฐ ๊ฐฑ์‹ 
                    result.add(p.name); //๊ณผ์ œ ๋งˆ์นจ
                } else { //๊ณผ์žฌ ๋ชป๋งˆ์นจ
                    stack.add(new Plan(p.name, p.start, now + p.playtime - next)); //์ค‘๋‹จํ•˜๊ณ  ๊ณผ์ œ ๋Œ€๊ธฐ์—ด
                    // now = next;
                    break;
                }
            }
        }
        
        //์ž ์‹œ ๋ฉˆ์ถ˜ ๊ณผ์ œ ๋ชจ๋‘ ๋‹ค์‹œ ์‹œ์ž‘
        while (!stack.isEmpty()) {
            result.add(stack.pop().name);
        }
        
        //List -> ๋ฐฐ์—ด ๋ณ€ํ™˜
        return result.toArray(new String[0]);
    }
    
    public int startToMin(String start) { //์‹œ์ž‘์‹œ๊ฐ„์„ ๋ถ„์œผ๋กœ ๋ณ€ํ™˜
        String[] time = start.split(":");
        
        return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
    }
}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

๋ฐฐ์šด์ 

  • ๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
Collections.sort(planList, (p1, p2) -> p1.getStart() - p2.getStart());

 

  • List -> ๋ฐฐ์—ด ๋ณ€ํ™˜
result.toArray(new String[0])

 

  • ์Šคํƒ์œผ๋กœ ์ •ํ•ด์ง„ ๊ณผ์ •์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ ์˜ˆ์™ธ ์ƒํ™ฉ ์—†์ด ๊ฐ„๋‹จ ๋ช…๋ฃŒํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋…ผ๋ฆฌ๊ฐ€ ์•ˆ ๋งž์œผ๋ฉด ์ž๊พธ isEmpty๋‚˜ popํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.