고득점 Kit [스택/큐] - 기능개발 ★★

세나정·2023년 5월 1일
0

문제

내 풀이

처음에 생각한 풀이는 주석으로 다음과 같이 남겼었다.

스택에 p의 한 개랑 s의 한 개를 뽑아서 더해주다가
p가 100보다 커졌을 때 다음으로 넘어감
대신 넘어갈 시점의 반복수 *s 가 100을 넘은다면 걔도 통과
그렇지 않다면 스피드로 남은 일수를 계산해줌
결론적으로 i가 같지 않게되는 것이니 return값은 증가하게됨

하지만 생각을 해보니 반복일수를 굳이 stack에 담아 배열로 활용할 필요없이 변수로 할용하면 편했었다.

또한, 앞에서부터 완료한 순으로 제거가되니 스택을 활용하는 것이 아니라 큐를 활용하면 더욱 편하게 앞에서부터 제거를 해나갈 수 있다.

어떻게 보면 논리는 비슷했지만 구현하는 접근방식에 있어서 달랐던 것 같다.
큐를 활용한다면 while문 + [0]만을 이용해서 반복문을 돌리다가
shift를 활용하면 되기 때문

다른 사람 풀이

  1. 비슷한 접근법
    조건문을 두 가지 동시에 돌려서 100이상이 되면 뽑는 동시에 cnt값도 한 개 증가시켜 answer배열에 push하였다.
 function solution(progresses, speeds) {
  let answer = [];

  while (speeds.length > 0) { // speed 배열길이가 0이 될때까지
    let cnt = 0;
      
    for (let i = 0; i < speeds.length; i++) { // progress와 speed 짝지어 더하기
      if (progresses[i] < 100) { // 100이 넘어가면 그만 더하기
        progresses[i] += speeds[i];
      }
    }
      
    while (progresses[0] >= 100) { // 맨앞의 progress배열이 100이 넘으면 shift
      progresses.shift();
      speeds.shift(); // speed도 shift
      cnt++; // 빼자마자 다음 애도 100이 넘는다면 while문을 벗어나지 않고 cnt를 증가시킴
    }
      
    // while문을 벗어났고 그 값이 0보다 크다면 cnt를 넣어줌
    if (cnt > 0) {
      answer.push(cnt);
    }
      
  }
  return answer;
}
  1. 다른 접근법 풀이 (days를 여긴 건 비슷)
  function solution(progresses, speeds) {
    // answer: 각 배포마다 배포되는 기능의 수가 적힌 정수 배열
    var answer = [];
    // days: 배포일
    let days = 1;
    // cnt: 오늘 배포되는 기능의 수
    let cnt = 0;
    // progress: 현재 기능의 작업 진도
    let progress = 0;
    
    // 모든 작업이 다 배포될 때까지 반복
    while(progresses[0]){
        // 첫 번째 기능의 작업 진도
        progress = progresses[0] + (speeds[0] * days);
        // 첫 번째 기능의 작업 진도가 100 이상인 경우 배포 완료
        if(progress >= 100){
            // 배포 완료된 기능 개수 추가
            cnt++;
            // 배포 완료된 작업 제거
            progresses.shift();
            // 배포 완료된 작업의 속도 제거
            speeds.shift();
        }
        // 첫 번째 기능의 작업 진도가 100 미만일 경우 배포 불가능
        else{
            // 배포 완료된 기능이 있는 경우, answer에 push
            if(cnt > 0){
                answer.push(cnt);
            }
            // 배포일 증가 (다음날)
            // 여기에서 더해준 days값으로 위에 days와 계산
            days++;
            // 배포 완료된 기능 개수 초기화
            cnt = 0;
        }
    }
    // 모든 작업이 다 배포되고 나면, 마지막으로 카운트된 배포 완료 기능 개수 push
    answer.push(cnt);
    
    return answer;
}

느낀점

while[0]을 통한 큐 활용법을 깨닫고 여러 조건문이 동시에 등장 했을 때 실행 순서를 잘 떠올려야할 것 같다 꼭꼭 복습해야할듯

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글