Programmers - 스택/큐 > 기능개발

박재현·2021년 7월 10일
0

알고리즘 부수기

목록 보기
6/43
post-thumbnail

내 풀이

문제를 보이는 그대로 풀었다. 추가적으로 쉽게 풀 수 있는 방법을 생각하진 않았다.

  1. progresses, speeds 배열을 뒤집는다.
  2. progresses[i] += speeds[i]
  3. progresses 맨 끝 원소가 100 미만일 때까지 pop하고 cnt++
    3-1. temp에 pop값 넣어서 100이상이면 pop & cnt++
    3-2. 아니면 cnt = 0 & 과정 2부터 반복
  4. progresses 배열이 비어있으면 마무리
function solution(progresses, speeds) {
  // 과정 1
  let reProgresses = progresses.reverse();
  let reSpeeds = speeds.reverse();
  let cnt = 0;
  let answer = [];

  while (true) {
    // 과정 2
    if (reProgresses[reProgresses.length - 1] < 100) {
      reProgresses = reProgresses.map(
        (progress, index) => (progress += reSpeeds[index])
      );
    } else {
      while (true) {
        // 과정 3
        if (reProgresses.length !== 0) {
          reProgresses.pop();
          cnt++;
          if (reProgresses[reProgresses.length - 1] < 100) {
            answer.push(cnt);
            cnt = 0;
            break;
          }
        } else {
          answer.push(cnt);
          return answer;
        }
      }
    }
  }
}

모범 답안

있는 그대로 푼 내 방법과는 다르게 기준 값 100까지 남은 일수를 배열에 집어넣어 풀었다.
남은 일수만 가지고 문제에 접근하니 신경 쓸 경우가 줄어들고 코드가 훨씬 간단해졌다.
또한, 문제를 보다 논리적으로 접근하였다.

  1. 남은 일과에 하루당 작업 효율을 나눈다.
  2. 남은 일수와 기준되는 maxDay값을 비교하여 answer에 동시 반영되는 기능의 수를 적용한다.
    2-1. day[i]가 maxDay보다 크지 않으면 answer[i]++
    2-2. day[i]가 maxDay보다 크면 day[i]를 maxDay값으로 대체 후 다음 answer에 1 삽입
function solution(progresses, speeds) {
  let answer = [0];
  // 과정 1
  let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
  let maxDay = days[0];

  //과정 2
  for(let i = 0, j = 0; i< days.length; i++){
    if(days[i] <= maxDay) {
      answer[j] += 1;
    } else {
      maxDay = days[i];
      answer[++j] = 1;
    }
  }

  return answer;
}

얻어갈 부분

  • answer에서 원하는 내용이 무엇인지 계속 인지한다.
  • 되도록 시간이 오래 걸리지 않는 선에서 논리적으로 문제를 접근해본다.
profile
공동의 성장을 추구하는 개발자

0개의 댓글