넘치게 채우기

[프로그래머스] 카페 확장 (PCCP 모의고사 #2 3번) 본문

PS/Programmers

[프로그래머스] 카페 확장 (PCCP 모의고사 #2 3번)

riveroverflow 2023. 12. 10. 15:50
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

프로그래머스 - 카페 확장 (PCCP 모의고사 #2 3번)

문제 유형 : 큐

문제 난이도 : Level 2

 

문제 설명

주원이는 카페를 운영하고 있습니다. 주원이의 카페는 맛집으로 소문나서 항상 줄이 끊이지 않습니다. 하지만 카페가 협소하여 커피를 기다리는 손님들은 종종 불만을 토로하고 있습니다. 주원이는 카페를 확장하기로 하고, 얼마나 많은 손님들이 동시에 카페에 머무는지 확인해보려 합니다.

 

주원이네 카페에는 영업을 시작하자마자 0초에 손님 한 명이 가게에 도착하고, 정확히 k초마다 새로운 손님 한 명이 카페에 와서 줄을 섭니다. 손님들은 키오스크를 통해 주문하고, 주원이는 주문받은 순서대로 음료를 만듭니다. 주원이는 음료를 한 번에 하나씩 만들며, 지금 만들고 있는 음료를 다 만들면 다음 음료를 만들기 시작합니다. 손님은 자신이 주문한 음료를 받자마자 카페를 나갑니다. 주원이네 카페에는 여러 종류의 음료를 판매하고 있는데 각 음료들은 0번부터 차례대로 번호가 지정되어 있습니다. 또한 주원이가 같은 종류의 음료를 만드는데 걸리는 시간은 항상 동일합니다.

 

주원이는 오늘 주문받은 음료 목록을 이용하여, 카페에서 손님들이 동시에 최대 몇 명이 머물렀는지 알고 싶습니다. 손님들이 카페에 도착하여 주문하기까지 걸린 시간과 음료를 받은 후 카페를 나가는 시간은 음료 제조 시간에 비해 대단히 짧기 때문에 무시합니다. 한 손님이 카페에서 나감과 동시에 다른 손님이 카페에 들어올 경우, 나가는 손님이 먼저 퇴장한 다음 들어오는 손님이 입장합니다.

예를 들어, 주원이네 카페에서 세 종류의 음료를 판매하고 제조 시간은 0번 음료가 5초, 1번 음료가 12초, 2번 음료는 30초 소요된다고 가정합니다. 영업을 시작한 뒤 4명의 손님이 각각 0초, 10초, 20초, 30초에 카페에 도착하여 순서대로 1번, 2번, 0번, 1번 음료를 주문한 경우, 영업 시작 후 30초부터 42초 사이에 3명의 손님이 기다리게 되고, 이때가 동시에 기다리고 있는 손님이 가장 많은 시간입니다.

 

주원이네 카페에서 판매하는 각 음료들의 제조 시간을 담은 정수 배열 menu와 오늘 손님들이 주문한 음료가 순서대로 적힌 배열 order, 새로운 한 명의 손님이 방문하는데 걸리는 시간인 k가 매개변수로 주어집니다. 오늘 카페에 동시에 존재한 손님 수의 최댓값을 return 하도록 solution 함수를 작성해주세요.

 

 

풀이

손님 대기열 큐를 하나 만든다. 손님이 주문한 음료를 준비하는 데 걸리는 시간을 저장시킨다.

반복문으로 0초부터 다음을 구현한다:

  1. 주문한 손님이 있으면, 가장 먼저 온 손님의 남은 시간을 1 감소시킨다.

  2. 만약 남은 시간이 0 이하라면, 큐에서 뺀다(음료 제작 완료 후 퇴장)

  3. 손님이 k초마다 입장하므로, (지금 시간)%k == 0인경우에 손님을 하나 입장시킨다. 몇 번쨰 손님인지를 따로 저장해서, menu[order[orderidx++]]을 큐에 넣자. 이는 방금 온 손님의 주문 메뉴를 만드는 데 걸리는 시간이다.

  4. 현재 큐의 크기(현재 존재하는 손님의 수)를 구하고, 최대값을 갱신시킨다.

  5. 시간을 1 올려서 진행시킨다.

 

최대값을 반환해주면 된다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

int solution(vector<int> menu, vector<int> order, int k) {
    queue<int> q;
    int time = 0;
    int orderIdx = 0;
    ulong maxCustomer = 0;
    
    const int maxTime = k * (order.size()-1);
    
    while(time <= maxTime) {
        if(!q.empty()) {
            q.front()--;
            if(q.front() <= 0) {
                q.pop();
            }      
        }
        if(time%k == 0) {
            q.push(menu[order[orderIdx++]]);
        }
        maxCustomer = max(maxCustomer, q.size());
        time++;
    }
    
    return maxCustomer;
}
 
728x90
반응형