학습 정리/👨‍💻 PS Study

[C++] 프로그래머스 - 과제 진행하기

무딘붓 2023. 6. 22. 10:45

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[소스 코드]

//23.06.22

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(vector<string> a, vector<string> b)
{
    return a[1] < b[1];
}

vector<string> solution(vector<vector<string>> plans) {
    vector<string> answer;
    vector<pair<string,int>> waitTesk;
    sort(plans.begin(), plans.end(), compare);;
    
    int time=0;
    
    for(vector<string> v : plans){
        int newTime= 60*stoi(v[1].substr(0,2)) + stoi(v[1].substr(3,5));
        
        while( time < newTime ) {
            if(waitTesk.size() > 0 ){
                waitTesk.back().second--;
                if(waitTesk.back().second==0){
                    answer.push_back(waitTesk.back().first);
                    waitTesk.pop_back();
                }
            }
            time++;
        }  
        
        waitTesk.push_back(make_pair(v[0],stoi(v[2])));
    }
    while(waitTesk.size()>0){
        answer.push_back(waitTesk.back().first);
        waitTesk.pop_back();
    }
    return answer;
}

문제를 풀면서 공부했던 점은 크게 2가지입니다.

1. compare() 함수를 만들어서 vector를 원하는 기준으로 배열하게 하기.

2. pair<자료형, 자료형>를 이용하여 문자열과 정수 함께 저장하기.

 

 

문제 풀이 과정은 다음과 같습니다.

1. sort()함수를 이용해 입력받은 과제를 시작 시간순으로 정렬

2. 비교가 쉽도록, 시간을 정수로 변환 (60*시간+분)

 

3. 이전에 입력받은 시간에서 새로 시작해야 하는 과제의 시작시간까지 1분씩 더해가면서, 진행중인 과제 진행

    ( 이 과정에서, 진행중인 과제가 끝나면 다음 과제 (=잠시 멈춘 과제) 불러와 실행)

4. 새로 시작해야 하는 과제의 시작시간이 되면, 새로 시작해야 하는 과제를 진행 중인 과제 배열에 추가

    ( 과제이름(문자열) - playtime(정수) 형태로 추가)