/ CODING

<프로그래머스> 스택/큐 Level 2 기능개발 (1)


프로그래머스 > 스택/큐

큐를 사용해서 100을 넘은 데이터들은 순서대로 빼내는 문제였다.

나는 코드를 굉장히 직관적으로 짰다.
que에 progresses를 담고
que.peek()를 이용해 값을 하나씩 꺼내어
que.peek() + day x speed 이 100을 넘기는지,
넘을때마다 변수 k 에 +1 해주어 반환할 k를 변경시켜주는식
and 중간중간 맞는 조건문을 넣어주었다

[코딩에 잠깐 난관이 있었다면]
이 문제는 날짜에 따라 100을 넘은 기능들이 연속으로 있다면 k를 계속 올려주면 그만이지만
연속적일지 아닐지는 100이 넘었다는 조건문 안에서 알 수 없기 때문에 que2.offer(k)를 다른 곳에 넣을 수 밖에 없었다.

반대의 100을 넘지 않는다는 조건에서 day를 올려주거나 k=0 으로 맞춰주는데

이 조건에 대해
바로 전에 100을 넘다가 온 경우에만 k값을 저장해주는 설계를 했기 때문에 40에서 41로 온것인지를 어떻게 구분해줄것인가를 한참 생각했다.
쉬웠지만 너무 어렵게 생각한것 같다.

boolean check=false를 두고
100이 넘은 경우에는 check=true,
넘기지 못한 경우에는 check=true의 조건문을 주고 해당 될때만 k값을 반환할 que2.offer(k)해주고 k=0으로 다시 시작해준다.

코드를 살펴보자

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public static int[] solution(int[] progresses, int[] speeds) {

		 
		  // progresses
	      Queue<Integer> que = new LinkedList<>(); 
	      // return 값이 들어갈 que2 
	      Queue<Integer> que2 = new LinkedList<>(); 

	      
	      int i = 0;
	      int day = 1; 
	      int k = 0; //k는 배포 횟수 
	      for(i = 0; i<progresses.length; i++) {
	         que.offer(progresses[i]);
	      }

	      int count=0;
	      i=0;
	      boolean check = false; // 100이 안됐다. 
	       
	      while(i<progresses.length) {
	                                                //            1일 ,  2일     7일
	         int total = que.peek()+(speeds[i]*day); // total = 93+1*1, 93+1*2  93+1*7 // 30 + 30*7 //55 + 5*7
	          
	         if(total>=100) {   //total 93  //94 //95 //100 //240  //
	        	 k++;   //k=1; k=2; // 배포 값 
	        	 i++;   //i=1 i=2;  // 다음 숫자로 넘김 
	        	 que.poll(); //[30,55] //[55]
	        	 check = true; 
	        	 
	        	 if ( i == speeds.length ) {
	        		 que2.offer(k);	 
	        		 count++;
	        	 }
	            
	         }else {    // total=90
	             
	            if(k!=0 && check == true ) { //배포한 후 더이상 배포할 애가 없을때 
	               que2.offer(k); // [2][0][0] 
	               k=0;
	               count++;
	            }
	            check = false;
	            day++;        // j =1 j =2; 7 
	         }
	     
	      }
	  
	      int[] answer = new int[count];
	    
	       
	      int t=0;
	    
	      while(!que2.isEmpty()) {
	    	  answer[t]= que2.poll();
	    	  t++;
	       }
	       
	      
	      return answer;

	   }
}




커버사진 출처 프로그래머스