Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - Lv. 0
- SQL 고득점 KIT
- Java
- 파이썬
- dfs
- join
- softeer
- programmers
- SQL
- 너비 우선 탐색
- Lv. 2
- 프로그래머스
- 깊이 우선 탐색
- 티스토리챌린지
- LEVEL 2
- bfs
- DP
- Python
- 자바스크립트
- Baekjoon
- 동적계획법
- group by
- Lv. 3
- 백준
- Dynamic Programming
- Lv. 1
- level 3
- 소프티어
- 오블완
- javascript
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 과제 진행하기 {언어 : JavaScript} 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/176962#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
function solution(plans) {
    const lenP = plans.length - 1;
    const answer = [];
    let stack = [];
    // 시작 시간으로 정렬
    const sortedP = plans.map(([n, s, p]) => {
        const [sh, sm] = s.split(":");
        return [n, Number(sh)*60+Number(sm), Number(p)];
    });
    sortedP.sort(([n1, s1, p1], [n2, s2, p2]) => s1 - s2);
    while (sortedP.length) {
        const [cn, cs, cp] = sortedP.shift();
        const cscp = cs + cp;
        if (sortedP.length) {
            const [nn, ns, np] = sortedP[0];
            if (cscp <= ns) {
                answer.push(cn);
                let nscscp = ns - cscp;
                if (nscscp) {
                    while (stack.length) {
                        const lenS = stack.length;
                        const [sn, ss, sp] = stack[lenS-1];
                        if (sp <= nscscp) {
                            answer.push(sn);
                            stack.pop();
                            nscscp -= sp;
                        } else {
                            stack[lenS-1][1] += nscscp;
                            stack[lenS-1][2] -= nscscp;
                            break;
                        };
                    };
                };
            } else {
                stack.push([cn, ns, cscp-ns]);
            };
        } else {
            answer.push(cn);
            while (stack.length) {
                const [sn, ss, sp] = stack.pop();
                answer.push(sn);
            };
        };
    };
    return answer;
}풀이 방법
- 계산에 용이하기 위해 시간을 분으로 바꾼다.
- 예를들어 12:00 => 12*60 = 720분
 
- 이제 시작 시간 순으로 정렬한다.
- 정렬한 배열을 하나씩 뺀다.
- 하나를 빼고 나서 sortedP의 길이가 0이라면
- 현재 과제 이름을 answer에 넣고
- 나머지를 모두 pop하면서 answer에 저장한다.
 
- 0이 아니라면 다음 요소를 확인한다.
- 현재시간에 과제를 수행하는데 걸린 시간을 더한 값 = cscp와 다음 시작시간을 비교한다.
- 다음 시작 시간보다 cscp의 값이 작다는 말은 시작하기도 전에 끝낸다는 말이므로 answer에 이름을 넣는다.
- cscp값과 다음 시작시간까지 얼마나 시간이 남았는지 확인한다 = nscscp
- nscscp값이 0보다 크다면 남는 시간동안 stack에 있는 요소들을 확인하며 끝낼 수 있는 것들은 끝내고 answer에 집어넣는다.
- 끝내지 못했을 경우에는 stack에 마지막 요소에서 수행하는데 걸리는 시간에서 nscscp값을 빼주고 현재 시각에 nscscp값을 더해준다.
 
 
- cscp값과 다음 시작시간까지 얼마나 시간이 남았는지 확인한다 = nscscp
- cscp값보다 작다면
- stack에 현재 요소를 넣는다.
 
 
- 다음 시작 시간보다 cscp의 값이 작다는 말은 시작하기도 전에 끝낸다는 말이므로 answer에 이름을 넣는다.
 
- 현재시간에 과제를 수행하는데 걸린 시간을 더한 값 = cscp와 다음 시작시간을 비교한다.
 
- 하나를 빼고 나서 sortedP의 길이가 0이라면
- 마지막으로 answer를 출력한다.
느낀점
- 머리가 잘 안돌아갈 때는 풀기 어려운 문제 같다.
728x90
    
    
  '알고리즘' 카테고리의 다른 글
| 프로그래머스 [Lv. 2] 리코쳇 로봇 {언어 : JavaScript} (0) | 2024.04.10 | 
|---|---|
| 프로그래머스 [Lv. 2] 광물 캐기 {언어 : Python} (0) | 2024.04.09 | 
| 프로그래머스 [Lv. 2] 두 원 사이의 정수 쌍 {언어 : Python} (0) | 2024.04.05 | 
| 프로그래머스 [Lv. 2] 연속된 부분 수열의 합 {언어 : JavaScript} (0) | 2024.04.05 | 
| 프로그래머스 [Lv. 2] 요격 시스템 {언어 : JavaScript} [2024.04.16 수정, 반례 추가] (0) | 2024.04.02 |