seunghyun Note

[프로그래머스] 기능개발(스택 공부 부수기) with JS 본문

코딩테스트/프로그래머스

[프로그래머스] 기능개발(스택 공부 부수기) with JS

승숭슝현 2024. 1. 17. 16:38

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

스택과 큐유형이어서 어려울 거 같아서 걱정했지만 로직만 이해하면 간단했다.
O(n^2)이 되고 싶지 않아 최대한 O(n)이 될 수 있는 방법을 생각했다.
그래서 표를 그리면서 언제 push를 할까...? 고민을 많이 했다.

안 좋은 코드라고 생각했지만 그래도 다른 사람들의 코드와 비교했을 때 깔끔했던 거 같다.

 

📌 새로운 배열을 정의해야 한다.

1-1 progresses배열은 작업속도이다. 작업속도는 100%가 되야한다.
그래서 남은 작업일을 구하기 전에 100% - progresses값을 구해야 한다.
1-2 speeds배열을 100%-progress에 나눠서 새로운 배열을 정의해야 한다

progresses speed array
[95,90,99,99,80,99] [1,1,1,1,1,1] (100- progresses) / speed

 

📌 정의된 arr를 순회시켜 조건에 따라 arr.push(cnt)를 한다.

순회할 때 push의 조건을 생각해보자!

max를 처음에 arr [0]으로 할당하고 index 1~arr.length-1까지 비교해 준다.

function solution(progresses, speeds) {
  var answer = [];
	//arr를 만들어줘야한다. 조건은 위 글을 참고  
  let arr = progresses.map((x, y) => Math.ceil((100 - x) / speeds[y]));
  //console.log(arr);
  //cnt를 1로 초기화
  let cnt = 1;
  let max = arr[0];	//max를 0번째 인덱스 값으로 설정하기
  for (let i = 1; i < arr.length; i++) {
  //max보다 크다면 바로 push를 해주고 max를 바꿔준다.
    if (arr[i] > max) {
      answer.push(cnt);
      max = arr[i];
      cnt = 1;
    } else {
      cnt++;
    }
    //console.log(arr[i], cnt, max);
  }
  //배열의 순회가 끝났다면 마지막 값을 위해 push해서 마무리
  answer.push(cnt);

  return answer;
}

console.log(solution([93, 30, 55], [1, 30, 5]));
console.log(solution([95, 90, 99, 99, 80, 99], [1, 1, 1, 1, 1, 1]));

 

마지막으로 중간중간 console을 띄워서 해결하기!! (필수)

728x90