[프로그래머스 코딩테스트 고득점 Kit - 스택/큐 (Level 2)] 기능 개발 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2023년 12월 26일
0

코딩테스트연습

목록 보기
44/98
post-thumbnail
post-custom-banner

1. 문제 설명

2. 제한사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2023-12-26)

이 문제는 제 머리로는 아직 풀기가 어려워서 구글링을 해서 답안을 참고했는데, 그래도 이해하는대에만 1시간이 걸렸습니다... ㄷㄷㄷ 그래도 이해는 끝낸 상태라 최대한 자세히 설명을 붙여놨습니다. 그래서 많이 지저분해 보이실 수도 있겠으나, 최대한 자세히 붙여 넣으려 했기에 감안해주시고 봐주시면 감사하겠습니다!

★ 구현 이해 설명 ★

  1. 첫번쨰 for문의 조건으로 sum(완료 된 프로그래스를 카운트 하는 변수)와 현재 프로그래스 배열의 길이가 같지 않을 때, 즉 아직 실행되는 프로그래스가 하나라도 있을 경우 두번째 배열의 for문의 조건으로 프로그래스의 배열의 길이만큼 반복하면서 progresses[i](현재 프로그래스의 진행 상태) + j(날짜) * speeds[i](해당 프로그래스가 하루에 낼 수 있는 속도)를 각각 rate 배열에 담습니다.
  1. 그 후 if문의 조건으로 rate[p] (p는 현재 0, 즉 해당 날짜에 진행된 첫번째 프로그램의 진척도)가 100 이상일때, 즉 완료 되었다고 할 때 count와 p를 누적 증가시키면서 현재 프로세스(rate[p])의 진척도가 100 이상일 때만 while문을 돌리도록 합니다. 이후 p의 값과 현재 날짜에 완료된 프로그램을 카운트 할 count의 값이 같을 때, 즉 while문에서 순차적으로 책정된 p(프로그램)과 책정된 rate 배열의 길이가 같을 때 while문을 빠져나오도록 합니다.
    만약 100 이상의 진척도를 넘기지 못한 프로그램이 배열에 하나라도 있다면 while문을 빠져나와 현재까지 첫번째 while문 사이클에서 진행이 완료된 프로그램들의 카운트 값(count)가 answer배열에 push 되게 됩니다.
  1. 바로 아래 for문은 answer(정답 배열)의 길이만큼 반복하면서 sum 변수에 answer 배열의 요소를 누적 합산 시켜주는 구문인데, 만약 첫번째 날에 완료된 프로세스가 2개고 미완료된 프로세스가 하나라면 sum에는 2가 저장된 후 다시 처음 for문의 범위 조건에 맞지 않으므로 다시 처음부터 for문이 돌게 됩니다. 그리고 while문 바로 위의 if문의 조건(완료되지 못한 rate[p] 가 다음 날에는 100 이상일 경우)에 부합하고 count(현재 날짜의 완료 된 프로세스 카운팅 변수)를 0으로 초기화 한 후 while문을 돌리면서 count를 증가하고 p를 증가시키고
  1. 마지막에 p(완료 된 프로세스)와 rate.length(책정 된 배열의 길이) 가 같다면 while문을 종료시킨 후 카운트 된 count 변수를 answer배열에 push 합니다.
  1. 이제 첫번째 for문의 조건은 거짓(최종 완료 된 프로그램의 수랑 progresses 배열의 길이를 비교 했을 때 같은 경우)이 되므로 for문을 실행하지 않고 최종적으로 담겨진 answer 배열을 반환합니다.
function solution(progresses, speeds) {
    let answer = [];
    let rate = [];
    let i, j, k;
    let p = 0, sum = 0, count;

    for(j = 1; !(sum === progresses.length); j++){
        sum = 0;
      
        for(i = 0; i < progresses.length; i++){
            rate[i] = progresses[i] + j * speeds[i]; 
        }

        count = 0;
        if(rate[p] >= 100) {
            while(rate[p] >= 100){
                count++;    
                p++;

                if (p === rate.length) break;
            }
            answer.push(count);
        }

        for(k = 0; k < answer.length; k++){
        sum = sum + answer[k];
        }
    }
    return answer;   
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.
post-custom-banner

0개의 댓글