본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 기능개발

by YWTechIT 2021. 10. 22.
728x90

📍 프로그래머스 2단계 - 기능개발

프로그래머스 2단계 - 기능개발


⚡️ 나의 풀이

이 문제에서 제일 크게 거쳐야 하는 기능은 2가지로 나뉜다. 첫 번째는 progressesspeeds  값을 이용해서 배포가 며칠이 소요되는지 구해야 하고, 두 번째는 배포 날짜를 모아둔 값에서 제일 처음부터 배포를 할 때 다음 값이 현재 배포 일 수보다 작으면 같이 배포되고, 더 크면 나중에 배포되는 cnt값을 구해야 한다. 내가 풀 때는 첫 번째까지는 무난하게 구했는데 두 번째 cnt를 구하는 방식이 좀처럼 떠오르지 않았다.

 

도저히 방법이 떠오르지 않아 다른 사람은 어떻게 풀었는지 봤는데, for문 안에 i, j를 동시에 선언하고 count를 한 게 너무 신기했다. 거기에 j전치연산자를 사용했는데, 전치연산자는 예를 들어 현재 j값이 1일 때 +1을 더하고 2인 상태에서 계산을 하는 방법이다. 이런 계산을 할 때 사용하는 방법을 알았으니 다음에 써먹으면 된다. 참고로 지금 코드가 아닌 이전 코드를 제출했을 때 테스트 케이스 2번에 실패했는데, 그 이유는 Math.ceil100-progress에만 감싸줘서 그렇다. 대신에 전체 Math.ceil((100-progress) / speeds[idx]))에 감싸주면 정답처리를 받을 수 있다.

 

  1. progressesmap연산자를 사용해 100-progressspeeds[idx]로 나눠주었다. map 연산자에 파라미터는 첫 번째로 value 두 번째로 idx가 오는 특징을 이용했다.
  2. 초기 max값은 contributeDays[0]으로 설정했다. 이렇게 해야 대소 비교가 정상적으로 가능하다.
  3. contributeDays에 반복문을 사용해 현재 값보다 max가 더 크면 이전 값들까지 같이 배포한다. 반대의 경우에는 max를 갱신시키고 해당일부터 배포한다. 이때 j를 전치 연산자로 값을 늘려 새로 answer에 1을 추가했다.

 

728x90

 

function solution(progresses, speeds){
  let n = progresses.length;
  let contributeDays = progresses.map((progress, idx) => Math.ceil((100-progress) / speeds[idx]));
  let max = contributeDays[0];
  let answer = [0];

  for (let i=0, j=0; i<n; i++){
    if (max >= contributeDays[i]) answer[j]++;
    else{
      max = contributeDays[i];
      answer[++j] = 1;
    }
  }
  return answer;
}
반응형

댓글