Programmers/기타

C++ / 프로그래머스 / 2회 모의고사 - 카페 확장

GitHubSeob 2024. 3. 25. 07:20
문제

 

https://school.programmers.co.kr/learn/courses/15009/lessons/121689

 

프로그래머스

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

programmers.co.kr

문제풀이

 

문제를 잘못 읽어 조금 헤맸다.

직원은 한 명이기 때문에 여러 음료수를 동시에 만들 수 없다.

손님의 대기 순서가 변하는 경우도 없으므로 큐를 사용하여 풀 수 있다.

큐에는 대기 손님이 음료를 받아 나가는 시간을 입력하면 된다.

 

    for (int idx = 0; idx < order.size(); ++idx) {
        while (!waiting.empty() && waiting.front() <= idx * k) {
            waiting.pop();
        }

 

입장 손님과 나가는 손님이 같은 시간에 존재할 경우, 나가는 손님이 먼저 퇴장한다.

대기손님을 의미하는 waiting이라는 큐를 선언한다.

대기손님이 있고 현재 idx번째 손님이 입장했을 때, 나갈 수 있는 손님을 모두 내보낸다.

 

        if (time > k * idx) {
            time += menu[order[idx]];
        }
        else time = k * idx + menu[order[idx]];

 

 

만약 시간(바로 직전에 나간 손님의 시간)이 이번에 입장할 손님보다 늦을 경우, 이번 손님은 입장 시간이 아닌 전 사람이 나간 시간에 음료를 만드는 시간을 더한다.

 

이번 손님이 입장했을 때 아무도 나가지 않는다면 손님의 입장시간에 음료를 만드는 시간을 더한다.

 

        waiting.push(time);
        count = waiting.size();
        answer = max(answer, count);

 

대기손님에 이번 손님이 나갈 시간을 입력한다.

waiting은 현재 대기줄을 의미하므로 answer을 항상 answer와 현재 대기줄 중 큰 값으로 갱신한다.

코드
#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(vector<int> menu, vector<int> order, int k) {
    int answer(1);
    int time(0), count(0);
    queue<int>waiting;

    for (int idx = 0; idx < order.size(); ++idx) {
        while (!waiting.empty() && waiting.front() <= idx * k) {
            waiting.pop();
        }
        if (time > k * idx) {
            time += menu[order[idx]];
        }
        else time = k * idx + menu[order[idx]];
        waiting.push(time);
        count = waiting.size();
        answer = max(answer, count);
    }

    return answer;
}