본문 바로가기
Research/Coding Test

스택/큐_기능개발

by RIEM 2023. 3. 21.
728x90

Problem

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

여러 기능개발 작업들이 동시에 수행중이며 뒤의 작업은 앞의 작업보다 먼저 완료될 수 있다. 하지만 완료된 기능개발 작업들을 배포하는 순서는 앞의 작업 순서에 의존적이다. 즉, 앞이 먼저 배포가 되거나 배포가 될 때 뒤의 작업들도 배포가 될 수 있게 된다. 앞이 먼저 나가야 뒤도 나갈 수 있는 Queue 형태의 데이터 구조다.

Approach

tasks가 일종의 queue 구조가 된다. tasks가 아직 남아있음을 조건으로 while문을 돌린다. tasks의 가장 첫 작업이 끝났는지 여부를 확인한 뒤, 끝났다면 해당 작업을 tasks, speeds 배열에 빼준다. 이때 뒤에 작업들도 끝났을 경우도 고려해야 하는데, 몇개가 끝날지 예상할 수 없다는 문제가 있다. 이를 해결하려면 while문으로 100% 완성된 조건에 맞는 작업이 계속 나타날때 까지 계속 처리를 해주도록 했다.

처리를 다 하면 count에 처리한 작업의 수가 쌓이게 된다. 0 초과할 경우(처리한 작업이 1개 이상일 경우) result 배열에 처리한 작업의 수를 기록해준다.

그 다음은 아직 마무리하지 못한 작업들에 while문으로 진도를 추가해주는 작업을 해준다.

위 작업들을 반복하면 결국 tasks에는 빈 배열이 남게되고 함수는 최종 처리 기록 정보만 남아있는 result 배열을 반환한다.

Solution

function solution(progresses, speeds) {

  const tasks = [...progresses]
  const wip = [...speeds]

  const result = [];

  while(tasks.length !== 0) {

    console.log(tasks)
    let count = 0;

    // 1) 작업 완료된 경우(100 이상), count에 완료 기능 수를 저장
    while(tasks[0] >= 100) {
      tasks.shift();
      speeds.shift();
      count++;
    }
    // 동시에 완료 기능 수를 result에 입력
    if(count) result.push(count);

    // 2) 작업이 아직 미완인 경우
    tasks.forEach((el, idx) => {
      tasks[idx] = el + speeds[idx];
    })
  }
  return result;
}

const progressesInput = [93, 30, 55];
const speedsInput = [1, 30, 5];

console.log(solution(progressesInput, speedsInput));
728x90

'Research > Coding Test' 카테고리의 다른 글

leetcode_66. plus-one  (0) 2023.03.24
747. Largest Number At Least Twice of Others  (0) 2023.03.23
스택/큐_같은 숫자는 싫어  (0) 2023.03.21
20. Valid Parentheses  (0) 2023.03.21
13. Roman to Integer  (0) 2023.03.20

댓글