본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 기능개발

by StelthPark 2022. 3. 15.

처리조건

풀이

progresses에 각 작업 %가 들어간 배열이 들어온다. 이 배열은 맨앞에 작업이 100%가 되어야 뒤에 있는 작업들의 %을 검사할 것이고 100%가 된것들만 한번에 작업배열에서 나가게된다. 각 작업은 speeds에 있는 배열인덱스에 맞게 작업 %가 올라가게 될 것인데 먼저 progresses의 0번째 인덱스가 100이상인지 검사한다. 맞다면 이 작업은 무조건 일단 나간다. 그러므로 count를 ++ 하고 이제 뒤에 나갈수 있는 인덱스가 순서대로 100인지 검사한다. 1번째 작업부터 검사하므로 j와 j-1이 모두 100이상이어야 j는 나갈수 있다. 나가는 j는 count++를 해주고 해당 j 즉 인덱스를 endIndex에 기록한다. 왜냐? 내보낸 작업들을 progresses에서 짤라버리고 다시 while문을 돌려할 것이다.

 

만약에 0번째 인덱스가 100이 아니면 어차피 다 나갈 수 없으므로 speeds을 각 인덱스 별로 올려준다. while문을 여러차례 돌리는데 break되는 조건은 progresses에 있는 작업들이 하나도 없어야한다. 즉 길이가 0일 때 break한다.

 

여기서 주의할 점은 progresses에서 나갈수 있는 작업들은 나가고 나서 count에 올리고 splice로 해당 나간 요소들을 짤라낸다. 그럼 progresses의 길이도, 인덱스 순서도 바뀔것이다. else문의 for문에서 인덱스0이 100이상이 아닐때 speeds를 더하는 부분은 각 progresses와 speeds의 인덱스에 맞게 더해주고 있는데 우리는 splice를 통해 지금 progresses의 길이와 인덱스순서가 바꼈다. 그렇기에 splice를 speeds에서도 사용하여 사라진 작업을 제거해 주어야한다.

 

function solution(progresses, speeds) {
  let result = [];

  while (1) {
    let count = 0;
    let endIndex = 0;

    if (progresses.length <= 0) {
      break;
    }

    if (progresses[0] >= 100) {
      count++;
      for (let j = 1; j < progresses.length; j++) {
        if (progresses[j] >= 100 && progresses[j - 1] >= 100) {
          count++;
          endIndex = j;
        } else {
          break;
        }
      }
      result.push(count);
      progresses.splice(0, endIndex + 1);
      speeds.splice(0, endIndex + 1);
    } else {
      for (let i = 0; i < progresses.length; i++) {
        progresses[i] = progresses[i] + speeds[i];
      }
    }
  }

  return result
}

댓글