[프로그래머스] 기능개발 (Lv.2)
문제 링크
문제 설명
기능마다 현재 진도율 progresses와 하루 작업량 speeds가 주어진다.
배포는 앞 기능이 완료되어야 뒷 기능도 함께 배포할 수 있다.
각 배포마다 몇 개의 기능이 배포되는지 배열로 반환하라.
예) progresses = [93, 30, 55], speeds = [1, 30, 5]
- 1번 기능: (100 - 93) / 1 = 7일 후 완료
- 2번 기능: (100 - 30) / 30 = 3일 후 완료 → 1번 기다려야 하므로 7일째 함께 배포
- 3번 기능: (100 - 55) / 5 = 9일 후 완료 → 단독 배포
→
[2, 1]
내 풀이
front 인덱스로 아직 배포되지 않은 첫 번째 기능의 위치를 추적한다.
매일 front부터 끝까지 speed를 더한 뒤, front 기능이 100 이상이 되면
연속으로 100 이상인 기능들을 카운트해서 한 번에 배포한다.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
int front = 0;
int n = progresses.size();
while(front < n)
{
for(int i = front; i < n; i++)
{
progresses[i] += speeds[i];
}
if(progresses[front] >= 100)
{
int count = 0;
while(front < n && progresses[front] >= 100)
{
front++;
count++;
}
answer.push_back(count);
}
}
return answer;
}
시간복잡도 분석
| 연산 | 복잡도 | 이유 | |——|——–|——| | 하루 진행 (for loop) | O(n) | front부터 끝까지 speed 더하기 | | 배포 처리 (while) | O(n) | 전체 합산 최대 n번 | | 전체 | O(d × n) | d = 최대 진행 일수 |
progresses 최솟값 1, speeds 최솟값 1일 때 최대 99일, n ≤ 100이므로 O(99 × 100) = O(9,900) → 충분히 통과 가능하다.
오답노트
오답노트는 아니지만, 생각한 흐름도를 코드로 옮기는 데 시간이 오래 걸렸다.
후기
코테를 다시 풀기 시작한 지 얼마 되지 않은데다가, 다시 풀기 시작한 이후로 레벨 2는 처음 시도하는 거라서 그런지 머릿속에 있는 흐름도를 코드로 구현해내는데 시간이 오래 걸렸다.
익숙해질 수 있도록 꾸준히 풀어야겠다.