Post

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

[PCCP 모의고사 #2] 3번 - 카페 확장 문제를 Java로 해결한 풀이입니다. 조건문을 활용하여 특정 구간대의 가장 많은 사람수를 구합니다.

[PCCP 모의고사 #2] 3번 - 카페 확장

🙋‍♂️ 들어가며

우선 조건을 정리해보자

1
2
3
4
5
6
- 0초에 손님 도착, k초마다 손님 입장
- 주문받은 순서대로 음료 만든다
- 음료를 한번에 1개씩 만들고, 지금 만들고 있던 음료를 다 만들면 다음 음료 만들기 시작
- 음료 받으면 나간다

*구할 것 -> 동시에 최대 몇명 머물렀는지 알고 싶다
  • 1 <= menu <= 100
  • 1 <= order <= 10000
  • 1 <= k <= 100


생각을 한번 해보자

손님이 일찍 도착해도, 기계를 사용 못하면 기다려야하는 것

우선 조건은 N <= 10000 이라 $O(N^2)$ 도 가능하겠다

testcase로 보자

1
2
3
4
5
6
7
8
# tc-1
visit_time = {0, 10, 20, 30};
waiting_time = {12, 42, 47, 59};


# tc-2
visit_time = {0, 5, 10, 15, 20};
waiting_time = {5, 10, 15, 20, 25};

그렇다면 order = 10, k = 100이면?

1
2
3
4
visit_time = {0, 100, 200, 300};
waiting_time = {10, 20, 30};

-> final_waiting_time = {10, 110, 210, 310};

아 그러면 손님 방문시간과 음료 만드는 대기시간을 비교하여 더 오래걸리는 것을 쓰고 + 현재 손님에게 필요한 메뉴 추가 해주면 되겠다

그래서 첫 값을 대입하고 이런식으로 시간배열을 비교하면서 만들 수 있지 않을까?

구조 설계

1
2
1. 첫값 대입
2. 대기시간 = (손님 오는 시간 vs 이전 손님 대기시간) + 음료 만드는 시간



✅ 정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
    public int solution(int[] menu, int[] order, int k) {
        int max_people = 0;
        
        // 1. 첫 값 대입
        int N = order.length;
        int[] waiting_time = new int[N];
        int first_idx = order[0];
        int first_menu = menu[first_idx];
        waiting_time[0] = first_menu;
        
        // 2. 대기시간
        // (손님오는 시간 vs 이전 손님 대기시간) + 음료 만드는 시간
        for (int i = 1; i < N; i++) {
            int visit_time = i*k;
            int prev_customer_waiting = waiting_time[i-1];
            int cur_menu = menu[order[i]];
            waiting_time[i] = Math.max(visit_time, prev_customer_waiting) + cur_menu;
        }
        
        // 3. 계산
        for (int i = 0; i < N; i++) {
            int waiting = 0;
            int cur_time = i * k;
            for (int j = 0; j < i+1; j++) {
                // 3-1. 만약 현재시간보다 음료 만드는 시간이 더 길면
                if (cur_time < waiting_time[j]) {
                    waiting++;
                }
            }
            
            // 3-2. 갱신
            max_people = Math.max(waiting, max_people);
        }
        
        return max_people;
    }
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags