콘솔창 & 윈도우창/코딩 테스트

프로그래머스 LV.2 기능 개발

뽀또치즈맛 2024. 10. 31. 13:23

 

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

현재 과정에서 + 속도가 100이 넘으면 dequeue에서 꺼내주는 방식으로 계속 돌리다가.

다음 인덱스가 100이 넘지 않으면 자연스럽게 종료를 해주는 방식으로 구현했다.

 

이를 위해서 pair를 사용하여 구현하였다.

 

내가 짠 코드

#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <queue>
#include <deque>
#include<algorithm>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int cnt = 0;
    deque<pair<int, int>> work;

    for (int i = 0; i < progresses.size(); i++) {
        work.push_back({progresses[i], speeds[i]});
    }

    while (!work.empty())
    {
        cnt = 0;
        for (int i = 0; i < work.size(); i++) {
            work[i].first+= work[i].second;
        }
        for (int i = 0; i < work.size(); i++) {
            if (work[i].first >= 100) {
                work.pop_front();
                i--;
                cnt++;
            }
            else {
                if (cnt >= 1) answer.push_back(cnt);
                break;
            }
        }
    }
    if (cnt >= 1) answer.push_back(cnt);

    return answer;
}

 

 

 

이후 정답을 맞춘 뒤 가장 효율적인 코드가 어떤 것이 있었을까 하고 찾아보았다.

순차적으로 포문을 돌린 뒤, 이전의 작업에 소요되는 날을 구한다.

그 다음 작업들이 소요되는 날이 같거나, 그 날보다 작다면 back()++를 통해서 카운트를 늘렸다.

그렇게 비교하다가, 여태껏 소요되던 날보다 많으면 다음 빌드 일정으로 넘어가도록 짠 코드였다.

 

불필요한 int가 사용되지 않았다는 것에서 배울 점이 있었다.

또한 반복문 하나로 처리한다는 점에서 시간도 절약할 수 있었다.

다음부터는 최적화도 고려해야겠다.

 

반복문을 가장 적게 쓰고 짧은 코드

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;

    int day;
    int max_day = 0;
    for (int i = 0; i < progresses.size(); ++i)
    {
        day = (99 - progresses[i]) / speeds[i] + 1;

        if (answer.empty() || max_day < day)
            answer.push_back(1);
        else
            ++answer.back();

        if (max_day < day)
            max_day = day;
    }

    return answer;
}