구현기/알고리즘 문제풀이

[프로그래머스 코딩테스트 연습] 기능개발 JS

Sadie Kim 2023. 6. 12. 18:26

https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=javascript

나의 풀이

슈도 코드

  1. progresses 돌려서 완료일까지 남은 날짜수 담은 goalQueue 배열 정의
  2. 현재 날짜 date 변수를 정의하고 answer에 넣게 될 complete 변수 정의
  3. goalQueue의 맨 앞에 있는 애 가져옴(goal)
  4. 해당 goal과 date 비교
  5. 만약 date가 goal보다 크거나 같으면 pop으로 goalQueue에서 비우고 배포 처리, complete 1 증가
  6. 위 3~5를 계속 반복. goal이 date보다 작게 나오면 반복 탈출
  7. 한번에 배포처리한 수 complete를 answer에 넣고 complete 0으로 초기화. date 1 증가
  8. 위 3~8을 goalQueue 빌 때까지 반복

풀이 코드

function solution(progresses, speeds) {
  var answer = [];
  //완료일까지 남은 날짜수 담은 배열
  let goalQueue = progresses.map((prog, idx) => {
    return Math.ceil((100 - prog) / speeds[idx], 10);
  });

  let date = 0; //경과된 시간
  while (goalQueue.length > 0) {
    let complete = 0;
    while (true) {
      console.log(goalQueue);
      if (goalQueue.length <= 0) {
        break;
      }
      const goal = goalQueue[0];
      if (date >= goal) {
        complete++;
        goalQueue.shift();
      } else {
        break;
      }
    }
    if (complete > 0) {
      answer.push(complete);
    }
    date += 1;
  }
  return answer;
}

다른 사람의 풀이

내 풀이에 비해 가볍고 간단하게 푼 코드가 있어서 가져와 봤다.

슈도 코드

  1. progresses 반복문 돌려서 완료일까지 남은 날짜수 담은 days 배열 정의
  2. 목표 날짜수가 될 maxDay를 days의 첫 번째 원소로 정의
  3. days를 반복문 돌리면서 maxDay와 days의 현재 원소(days[i]) 비교
  4. 만약 maxDay가 days[i]보다 크다면 현재 인덱스의 answer 데이터 1 증가
  5. maxDay가 days[i]보다 작다면 maxDay를 days[i]로 초기화하고, answer의 인덱스를 한 칸 증가시켜서 1 담기

풀이 코드

function solution(progresses, speeds) {
    let answer = [0];
    let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
    let maxDay = days[0];

    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;
}

내 코드가 date를 하나하나 늘려 가며 반복문을 돌리는 다소 미련한 풀이라면, 다른 사람의 풀이 코드는 date가 목표 days와 일치하거나 뛰어넘는 시점만 반복하도록 하는 효율적인 풀이라고 볼 수 있겠다.