본문 바로가기
Algorithm/Programmers

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

by YOONAYEON 2024. 2. 19.
문제 (구현)

 

 

프로그래머스

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

programmers.co.kr

 

 

문제 풀이

 

0초 부터 손님이 마지막으로 입장할 시간의 초까지 for문으로 돌리면서 계산하였다.

i초 동안 반복하면서 1. 음료가 만들어지는 경우 / 2. 손님이 들어오는 경우 두 가지를 처리하면서 현재 인원을 계산했다.

여기서 내가 실수했던 부분은 음료가 다 만들어져서 사람이 나가자마자 바로 다음 음료를 만드는 것으로 구현했는데, 사람이 한 명 더 들어오기 전에 음료 제조가 끝나는 경우도 생각을 해주어야 했다.

그래서 처음에 몇몇 테스트케이스가 맞지않아서 해당 질문 목록에 있는 반례 예시로 다시 구현하니 바로 성공하였다.

반례 : menu = {5,6,7,11}, order = {1,2,3,3,2,1,1}, k = 10

 

구현은 별다른 알고리즘이 쓰이지 않아서 쉽긴 하지만 다양한 경우의 수를 생각하는 힘을 길러야 겠다고 생각했다ㅠ

하나의 예시만 보고서 구현하면 큰일난다 ..

 

 

소스 코드

 

class Solution {
    public int solution(int[] menu, int[] order, int k) {
        int max = 1, people = order.length;
        int curPeople = 1;			//현재 카페에 있는 인원
        int orderIndex = 0			//주문하는 사람 인덱스
        int enterIndex = 1;			//사람 들어오는 시간 카운트 인덱스
        int beverage = menu[order[orderIndex++]];	//음료제조시간
        
        for(int i = 0; i <= (people-1) * k; i++) {
        	//음료 다 만들었을 경우
        	if(orderIndex < people && i == beverage) {
        		curPeople--;
                //다음사람이 들어올 시간보다 현재시간이 더 빠르면서 지금 아무 사람도 없을때
        		if(curPeople == 0 && i < k * enterIndex)
        			beverage = (k * enterIndex) + menu[order[orderIndex++]];
        		else
        			beverage = i + menu[order[orderIndex++]];
        	}
        	//손님 들어올 시간
        	if(i == k * enterIndex) {
        		curPeople++;
        		enterIndex++;
        		max = Math.max(max, curPeople);
        	}
        }
        
        return max;
    }
}