🔗 문제 LINK

♟ 풀이 순서

  1. 각 작업에 걸리는 시간을 계산해 배열로 만든다. workingPeriod = [] (100% - 현 진행%)/작업속도 소수점올림 이 앞으로 걸리는 시간
  2. wokingPeriod를 forEach(period,index)로 돌면서
    • max < period 이면 max = period를 해준다.
    • forEach가장 마지막 배열일때, 다음배열이 max 보다 클때 num을 push 해주고 num을 초기화 해준다.
    • 그 이외에는 num++ 를 해준다.
    • ex) workingPeriod = [7,3,8]일 경우
    1. period = workingPeriod[0] = 7 num = 1, max = 7, answer = []
    2. period = workingPeriod[1] = 3 num = 2, max = 7, answer = [2] 다음으로오는 숫자가 3보다 큰 8이므로 answer에 num 값을 넣어준다.
    3. period = workingPeriod[2] = 8 num = 1, max = 8, answer = [2,1] 지금 8이 배열의 가장 마지막이므로 answer에 num 값을 넣어준다.

👾 코드

const solution = (progresses, speeds) => {
  let answer = [];
  let num = 1;
  let max = 0;
  let workingPeriod = progresses.map((day, index) =>
    Math.ceil((100 - day) / speeds[index])
  );
  //ref
  workingPeriod.forEach((period, index) => {

    if (max < period) max = period;

    if (workingPeriod.length - 1 === index || max < workingPeriod[index + 1]) {
      answer.push(num);
      num = 1;
    } else {
      num++;
    }
  });
  return answer;
};

👀 코드 비교

  • 다른 코드방법 중에서 내가 forEach문안에 쓴 if문을 훨씬 간단하게 한 방식이 눈에 띄었다. 이렇게 하면 anser에 직접 값을 넣어줌으로 num이라는 변수를 써주지 않아도 된다. 또 배열의 마지막일 경우에 대한 예외사항을 작성하지 않아도 되어서 좋았다.
    for(let i = 0, j = 0; i< days.length; i++){
          if(days[i] <= maxDay) {
              answer[j] += 1;
          } else {
              maxDay = days[i];
              answer[++j] = 1;
          }
      }
    

☕ 잡담

  • 물론 다른 방법중에서 while문안에 for를 사용하는 방법이 있었지만 O(n^2)라서 위와같은 방법을 채택했다.
  • forEach문안에서 if문을 어떻게 써야할지에대한 생각을 너무 오래했다. 조건사항에 대한 정리가 머리에서 잘 되지 않았다. 물론 연습장에 써보기도 하고 했는데 정리를 어떻게 해야 할지 감이 잡히지 않았다. 그렇게 많은 조건이 아닌 것 같은데 다음에도 또 이런 식으로 시간을 많이 쓸 것 같은데 연습하면 나아지는 건지를 잘 모르겠다.





Leave a comment