오늘은 드디어 프로그래머스에서 알고리즘 문제 풀이를 통해
알고리즘 코딩 공부를 해볼 예정입니다.
처음으로 풀어볼 문제는 바로 스택/큐 테마에서 "기능개발"이라는 문제입니다.
문제 난이도는 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.

'컴공생의 Knowledge > Algoritm Solution' 카테고리의 다른 글
[프로그래머스] 정렬 - K번째수 문제 풀이 (0) | 2022.06.18 |
---|---|
[프로그래머스] 해시 - "완주하지 못한 선수" 문제 풀이(Hash 활용) (0) | 2022.06.15 |
[프로그래머스] 해시 - "완주하지 못한 선수" 문제 풀이 (0) | 2022.06.14 |
[프로그래머스] 코딩 공부를 위한 프로그래머스 활용법 알려드립니다~ (0) | 2022.06.09 |
자료구조/알고리즘 코딩 공부는 여기서~ 프로그래머스!! (0) | 2022.06.08 |
댓글