티스토리 뷰

안녕하세요! 좋아요요정입니다 🙌

지난주 강의에선 양방향 링크드리스트와 스택 & 큐를 진행했습니다.

그 중 큐와 관련된 프로그래머스 숙제를 작성해봅니다! 

 


문제 요약 

- 프로그래머스 팀에서 기능 개선 작업을 수행 중. 

- 각 기능은 진도가 100%일 때 서비스에 반영. 

- 선입 선출의 구조로 뒤의 기능이 개발이 완료되어도 대기. 앞의 기능이 완료되었을 때 완료된 기능들이 함께 배포됨

 

제한 사항

- 작업의 개수는 100개 이하

- 작업 진도는 100 미만의 자연수

- 작업 속도는 100 이하의 자연수

- 배포는 하루에 한 번만 가능

 

입출력 예

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]

 


먼저 어떻게 구현을 할지 생각해봅시다.

1. 현재 완료된 상태와 하루 작업 가능량을 배열로 받습니다.

2. 선입선출로 먼저 들어온 기능이 먼저 나가고, 뒤이은 기능이 완료되었을 경우 함께 배포됩니다.

3. 하루에 완료된 기능이 있는 경우 answer에 완료된 기능의 수량을 추가합니다.

4. 모든 기능이 완료된 후 반환됩니다.

 

필요한 것은?

1. 선입 선출 큐! 

2. 완료일자를 카운트할 수 있는 함수

3. 큐에 쌓인 기능의 진행 상태를 확인하고 반환될 지 확인, 반환되는 수량을 카운트 하는 함수

 

 

배열로 하는 방법도 있지만.. 스택과 큐를 배웠으니 큐로 풀이해보겠습니다!

class Queue {
    constructor(progress, speed) {
        const newNode = new Node(progress,speed);
        this.first = newNode;
        this.last = newNode;
        this.length = 1;
    }
    enqueue(progress, speed) {
        const newNode = new Node(progress,speed);
        if(this.length === 0) {
            this.first = newNode;
            this.last = newNode;
        } else {
            this.last.next = newNode;
            this.last = newNode;
        }
        this.length ++;
    }
    dequeue() {
        if(this.length === 0) {return;}
        let temp = this.first;
        if(this.length ===1) {
            this.first = null;
            this.last = null;
        } else {
            this.first = this.first.next;
            temp.next = null;
        }
            this.length --;
            return temp;
    }
    setProgress(date) {
        if(this.length === 0) {return;}
        let temp = this.first;
        for(let i = 0; i < this.length; i++) {
            temp.progress = temp.progress+temp.speed >= 100 ? 100 : temp.progress+temp.speed;
            temp = temp.next;
        }
    }
    checkProgress() {
        if(this.length === 0) {return false;}
        return this.first.progress >= 100 ? true : false;
    }
}
class Node {
    constructor(progress, speed) {
        this.progress = progress;
        this.speed = speed;
        this.next = null;
    }
}

큐에 추가할 Node클래스와, 큐 클래스를 생성합니다.

큐는 큐의 last에 노드는 추가하는 enqueue(),  큐의 first의 노드를 삭제하는 dequeue(),  하루가 경과할 때 1일을 입력받아 progress+speeds 가 100이 될때까지  큐리스트를 반복하며 진행상태를 올려주는 setProgress()함수,  first의 노드의 진행상태가 100인지 확인하는 checkProgress()함수를 가지고 있습니다.

 

 

function solution(progresses, speeds) {
    var answer = [];
    const queue = new Queue(progresses[0], speeds[0]);
    for (let i = 1; i < progresses.length; i++) {
        queue.enqueue(progresses[i], speeds[i]);
    }
    do {
        let counter = 0;
        queue.setProgress(1);
        while(queue.checkProgress()) {
            queue.dequeue();
             counter ++;
        }
        if(counter > 0) { answer.push(counter)}
    } while(queue.length > 0)
    return answer;
}

 

우리의 함수는 진행상태배열과 하루진행가능량의 배열을 입력받습니다.

1. 먼저 큐리스트를 생성합니다.

2. 반복문을 돌며 큐리스트에 progress와 speed를 가진 노드를 추가해줍니다.

3. counter 변수는 완료된 기능의 수량을 체크합니다. 큐에 setProgress(1) 하루 시간을 경과시킵니다.

4. 첫번째 노드가 100 완료되었는지 확인하고, 100%이면 큐에서 삭제, counter 를 증가시켜줍니다.

5. counter가 0이 아닌경우 answer 배열에 추가해줍니다.

6. 큐의 수가 0이 될 때까지 반복하고 answer를 반환합니다.

 

 


요즘 이직준비로 정신이 없었습니다.

저번주 숙제인데 이제서야 하네요.. ㅠ_ㅠ 그래도 포기하지 않고! 남은 숙제도 얼른 해야겠습니다 ㅎㅎ

포트폴리오와 이력서를 얼추 마무리했으니, 이제 다시 공부에 포커스를 맞추고, 공부하며 면접을 기다려야겠습니다. :) 

3월이네요. 

2022년 3월도 건강하시고, 행복하세요!

 

 

 

JavaScript 스터디 팀 러버덕과 함께 합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/06   »
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
글 보관함