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;
}