본문 바로가기
컴공생의 Knowledge/Algoritm Solution

[프로그래머스] 스택/큐 - 기능개발 문제 풀이

by UIC 2022. 6. 13.
728x90

오늘은 드디어 프로그래머스에서 알고리즘 문제 풀이를 통해

알고리즘 코딩 공부를 해볼 예정입니다.

처음으로 풀어볼 문제는 바로 스택/큐 테마에서 "기능개발"이라는 문제입니다.

문제 난이도는 Level 2이며, 저는 JavaScript로 풀거니 참고해주세요!!

 

 

 

스택/큐 > 기능개발: Level 2 JavaScript

프로그래머스-스택/큐-기능개발-문제-정보

 

 

♣ 문제 설명

 

기능 개발 문제의 설명은 바로 아래와 같습니다.

 

프로그래머스-스택/큐-기능개발-문제설명

 

이해를 돕기 위해 간단히 문제를 풀어볼께요.

 

  • Summary
    • 각 기능은 진도가 100%일 때 서비스에 반영 가능하다.
    • 각 기능의 개발속도는 모두 다르다.
    • 기능들은 배포가 되며, 순서대로 배포 된다.
      이 때, 뒤에 있는 기능이 먼저 완료되면, 앞에 있는 기능 배포 시 함께 배포된다.
  • Inputs
    • progresses : 배포 순서대로 나열된 작업들의 진도 (정수 배열)
    • speeds : 각 작업의 속도 (정수 배열)
  • Outputs: 각 배포마다 배포되는 기능 수의 배열

 

 

 

 

이해가 쏙쏙 되시나요??

정리해보니 기능들을 순서대로 배포해야하는데,

각각 작업 진도가 다르고 현재 기능이 완료되는 시점에

완료된 기능들을 한번에 배포할 수 있는 기능의 수들을 계산하는 문제입니다.

 

역시 문제는 어려운거같아요.

그래도 열심히 도전해봅시다. 아직 시작 단계이니깐요!!

 

 

 

 

♣ 제한 사항

프로그래머스-스택/큐-기능개발-제한사항

 

제한 사항, 정말 중요합니다.

이 내용을 살펴보면 알고리즘 구현 시, 꼭 필요한 제약사항이라고 보시면 됩니다.

이 제한사항 하나하나가 알고리즘에 영향을 줄 수도 있다는 점 참고하시고

간단히 정리해볼께요.

 

  • 작업의 완료는 100이다. (기능 개발의 진도 최대값) 즉, 모든 입력 값은 100 이하이다.
  • 기능의 배포는 그날 작업 완료 후 한번만 진행한다.

 

 

♣ 입출력 예

프로그래머스-스택/큐-기능개발-입출력예

 

바로 이 것이 저희가 문제를 풀 때 테스트 하기위해 주어진 경우의 수입니다.

직접 푼 Solution() 함수를 통해 Input 값에 따라 정확한 Output 값이 나오는지 확인해볼 수 있습니다.

또한, 이 결과가 정상적으로 나와야 문제 풀이를 완료할 수 있습니다.

 

 

프로그래머스-스택/큐-기능개발-입출력예-설명

 

이렇게 입출력의 예에 대해서 이해를 위해 설명도 있지 않고 있습니다.

간단하게 입출력 예 #1에 대해서 그림으로 이해하고 넘어가볼게요~

 

 

 

 

 

♣ 예를 통한 이해

 

프로그래머스-스택/큐-기능개발-이해-이미지

 

 

 

이번엔 표로 다시 작성해볼까요?

 

시작 93% 30% 55%  
1일차 94%(+1) 60%(+30) 60%(+5)  
3일차 96% 100%(완료) 70%  
7일차 100%(완료) 100% 90% 2개 배포
9일차 - - 100%(완료) 1개 배포

 

 

 

다들 이제 문제는 이해 되셨겠죠!!

 

그럼 이제 진짜 문제를 코딩을 통해 문제를 풀러 가볼게요~

 

 

 

 

코딩보다 맨 처음에 해야할 것은 알고리즘을 짜는 것입니다.

어떤 과정을 통해 순차적으로 행해지면서 결과를 도출할 수 있는지,

그것이 바로 문제를 푸는 알고리즘입니다.

그럼 바로 알고리즘 만들어볼게요~

 

 

 

 

여기 접혀져 있습니다.

무심코 아래로 내리다가 제가 만든 알고리즘을 참고하게 될지 모르니깐요.

혹시 한번 머릿 속으로 생각해보시고 완성이 되셨다면 제 알고리즘을 확인해보시는걸 추천드릴께요.

저의 알고리즘과 다르더라도, 실망하지 마세요!!

답은 여러개가 있는게 바로 알고리즘의 매력이니깐요~

 

 

♣ 알고리즘 만들기


1. 모든 기능에 대해서 현재 진도(progress)에서 각 기능 별 개발 속도(speed)에 따른 진도를 증가시킨다.
2. 맨 앞에서부터 순서대로 있는 기능의 진도가 100% 이상인지 확인한다.
   2-1. 100% 이상인 경우
      2-1-1. 완료된 기능들의 개수를 증가시키고, 2로 이동한다.
   2-2. 100% 이하인 경우
      2-2-1. 3으로 이동한다.
3. 앞에서부터 완료된(진도가 100% 이상인) 기능이 있는지 확인한다.
   3-1. 배포된 기능을 제거한다.
   3-2. 위 개수를 배포 시 완료되는 기능 리스트 배열(result)에 넣는다.
4. 기능을 모두 배포하지 않았다면, 1로 이동한다.

 

 

 

위 알고리즘을 기반으로 코드를 짜보겠습니다.

 

바로 코드는 아래와 같이 구현할 수 있었습니다.

 

 

♣ 코드 구현

 

function solution(progresses, speeds) {
    let results = [];
    let curLocation = 0;
    
    // 4. 기능을 모두 배포하지 않았다면, 1로 이동한다.
    while(curLocation < progresses.length) {
    	// // 1. 모든 기능에 대해서 현재 진도(progress)에서 각 기능 별 개발 속도(speed)에 따른 진도를 증가시킨다.
        for(let i = curLocation; i < progresses.length; i++) {
            progresses[i] += speeds[i];
        }
        let count = 0;
        2. 맨 앞에서부터 순서대로 있는 기능의 진도가 100% 이상인지 확인한다.
        for(let i = curLocation; i < progresses.length; i++) {
            // 2-1. 100% 이상인 경우
            if(progresses[i] >= 100) {
                // 2-1-1. 완료된 기능들의 개수를 증가시키고, 2로 이동한다.
                count++;
            // 2-2. 100% 이하인 경우
            } else {
            	2-2-1. 3으로 이동한다.
                break;
            }
        }
        // 3. 앞에서부터 완료된(진도가 100% 이상인) 기능이 있는지 확인한다.
        if(count > 0) {
        	// 3-1. 배포된 기능을 제거한다.
            curLocation += count;
            // 3-2. 위 개수를 배포 시 완료되는 기능 리스트 배열(result)에 넣는다.
            results.push(count);
        }
    }
    
    return results;
}

 

정말 알고리즘대로 코드가 구현이 되었죠?

혹시 알고리즘만으로 코드를 구현하지 못하셨다면,

컴퓨터 언어의 기초를 좀 더 공부하셔야할 것 같습니다.

하지만 이걸 풀려고 노력하신 분들이라면,

충분히 여기까지 잘 따라오셨으리라 생각합니다.

 

 

 

 

이렇게 논리적 문제에 대해서

알고리즘을 만들어보고

그 알고리즘을 토대로 코드를 구현하는 것이

바로 알고리즘 문제 풀이의 매력이라고 생각합니다.

여러분도 위 순서대로 직접 다시 생각해보면서

꼭, 다시 문제를 풀어보시기 바랄게요~

 

 

 

 

그럼 오늘은 프로그래머스에서

스택/큐 테마의 기능개발이라는 문제를 풀어보았습니다.

다같이 공부하신 분들에게 화이팅이라는 응원의 한마디 전하며,

 

 

저는 20000.

728x90

댓글