[프로그래머스] 레벨2 - 기능개발

코딩테스트 연습 - 기능개발

문제 설명

입력으로

가 배열(또는 벡터)로 주어진다. 매일 progresses의 원소들은 speeds의 원소만큼 (1대 1 대응으로) 작업이 진행되는데 작업이 완료되면 배포가 된다. 다만 조건은 각각의 인덱스의 앞 인덱스의 작업이 완료되지 않으면 대기해야 한다는 것이다.

작업이 완료되는 날마다 그 횟수를 저장했다가 모든 작업이 완료되는 순간에 그 횟수를 리턴하는게 문제의 정답이다.

풀이

나는 이 문제를 일수를 기준으로 슬라이딩 하면서 풀이를 하였다. 더 효율적인 방법이 있겠지만 공간 사이즈가 크지 않아서 그렇게 풀어도 상관이 없다. 즉 작업이 완료될 수 있는 일인 1일부터 101일(예외 케이스가 생길 수 있기 때문에 101로 설정. 의미상 100일로 이해하면 된다.) 까지 for문을 순회하면서 작업이 완료됨을 체크해서 vector에 push_back하였다. 1일부터 101일까지 모두 순회 후 vector의 값을 리턴을 하면 정답이 된다.

코드

#include <string>
#include <vector>
using namespace std;

bool isCompleted[101];

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    
    for (int i = 1; i <= 101; i++) // 일 수 별로 슬라이딩
    {
        for (int j = 0; j < progresses.size(); j++) // 진도 업데이트
        {
            if (progresses[j] >= 100)
                continue;
            progresses[j] += speeds[j];
        }

        int ansElement = 0;
        for (int j = 0; j < progresses.size(); j++)
        {
            if (progresses[j] < 100)
                break;

            if (isCompleted[j])
                continue;

            isCompleted[j] = true;
            ansElement++;
        }

        if (ansElement > 0)
            answer.push_back(ansElement);
    }

    return answer;
}

소감

이 문제는 큰 틀로는 구현(implementation)으로 잡았지만 스택/큐 문제로 프로그래머스에 분류되어있다. 해당 문제는

이므로 무조건 맞춰야 함을 알 수 있다. 이번 problem-solving 프로젝트로 실력을 계속 향상시켜야 되겠다.

참조

[프로그래머스] 레벨2 - 프린터