송민준의 개발노트

프로그래머스-level2-라면공장 본문

알고리즘/프로그래머스

프로그래머스-level2-라면공장

송민준 2019. 12. 5. 22:52

https://programmers.co.kr/learn/courses/30/lessons/42629

 

코딩테스트 연습 - 라면공장 | 프로그래머스

라면 공장에서는 하루에 밀가루를 1톤씩 사용합니다. 원래 밀가루를 공급받던 공장의 고장으로 앞으로 k일 이후에야 밀가루를 공급받을 수 있기 때문에 해외 공장에서 밀가루를 수입해야 합니다. 해외 공장에서는 향후 밀가루를 공급할 수 있는 날짜와 수량을 알려주었고, 라면 공장에서는 운송비를 줄이기 위해 최소한의 횟수로 밀가루를 공급받고 싶습니다. 현재 공장에 남아있는 밀가루 수량 stock, 밀가루 공급 일정(dates)과 해당 시점에 공급 가능한 밀가루 수량

programmers.co.kr

자료구조는 우선순위 큐를 사용했다.

이유는 날짜에 따라 공급이 되는데 제일 큰 공급이 들어가야 한다. 그러자면 역정렬이 되어야 하는데 우선순위 큐를 써주면 간단해진다.

 

그리고 여기서 구하고자 하는 것은 최소한 공급한 공급 횟수이다.

즉 그 말은 무엇이냐 하면 공급 일자에 맞게 stock에 추가할 필요가 없다는 것이다.

공급필요일자와 다음 공급일자 사이에 재고가 떨어지면 공급 필요일자의 값을 넣어주면 되는 것이다. 

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
class Solution {
    public int solution(int stock, int[] dates, int[] supplies, int k) {
                int result = 0;
    			Queue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
    			// 우선순위 큐 생성
    			int SupplyIndex = 0;
    			for(int index = 0; index < k; index++) {  // k일까지 반복
    				// 공급 가능한지 체크, 일자가 공급 일자하고 일치하는지
    				if(SupplyIndex < dates.length && index == dates[SupplyIndex]) {
    					priorityQueue.add(supplies[SupplyIndex++]);
    				}
                    // 재고 소진시 보급
    				 if(stock == 0) {
    		                stock += priorityQueue.poll();
    		                result++;
    				 }
    				stock--; //재고 소진
    			}
    			
    			return result;
    		}
}

 

 

고민했던 흔적...(풀다가 스터디원이 우선순위 큐를 써보라 해서 코드 버림...)

public int solution(int stock, int[] dates, int[] supplies, int k) {
    		        // 공급일까지 
    		       int day = 1;
    		       int dateIndex = 0;
    		       int result = 0;
    		       // k일까지 while 돌림
    		       while(day == k) {
    		           stock--; // 하루마다  -1 재고소진
    		           if(dates[dateIndex] == day) { //날짜가 공급일과 일치하면
    		              if(dateIndex < dates.length) dateIndex++;   // 인덱스 1증가
    		              if(isSupply(stock, Arrays.copyOfRange(dates, dateIndex, dateIndex), Arrays.copyOfRange(supplies, dateIndex, dateIndex))) {
    		              stock += supplies[dateIndex];  // 재고에 투입
    		              result++;               // 공급횟수 1증가
    		              }
    		           }
    		           
    		              
    		              
    		           day++;
    		         }
    		      return result;
    		   }
    		   public boolean isSupply(int stock, int[] dates, int[] supplies) {
    		      int index = 0;
    		      int gap = dates[1]-dates[0];
    		      if(stock-gap > )
    		      
    		      return true;
    		   }