본문 바로가기

algorithm

[프로그래머스]기능개발

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

 

코딩테스트 연습 - 기능개발 | 프로그래머스

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇

programmers.co.kr

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 미만의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력의 예

progresses

[90, 30, 55]

speeds

[1,30,5]

return

[2,1]

 

풀이

큐를 사용하여, 먼저 들어 온 것이 먼저 나갈 수 있게 하였다.

   Queue<Integer> q = new LinkedList<Integer>();

(100 - progresses[i]) / speeds[i] 를 한 이유는 tDiv에 몇일에 작업이 완료 되는지 알기 위해하였다.

첫번 째 if조건을 통해 0이 작업이 남았기에 배포 날이 하루 플러스 된다.

두번 째 if조건은 tDiv > Temp 를 통해서 배포가 총 몇번 되는지 알 수 있습니다.

즉, count를 통해 결과 값의 크기를 구할 수 있습니다.

 for(i = 0; i < len; i++) {
 
   tDiv = (100 - progresses[i]) / speeds[i];
		   
   if (((100 - progresses[i]) % speeds[i]) != 0)
	  tDiv++;
		   
   if(tDiv > Temp) {
	  Temp = tDiv;
	  count++;
   }
   q.add(tDiv);
	   
   tDiv = 0;
}
	   

 

제일 처음으로 들어 간 큐의 값이 나오고, 결과 값은 1로 초기화 해준다. q.poll() 해 준 순간 한개가 배포 되기 때문이다.

다음부터 차례대로 큐의 값을 빼내어(tTemp1에 저장) tTemp와 비교를 해서 tTemp 값 보다 작으면 answer의 크기를 1 증가 시켜준다.

반대로 tTemp 값 보다 크면 tTemp1의 값을 tTemp에 넣어주고, 다시 이 기준의 날로 몇개가 배포 되는지 계산한다.

 

	   tTemp = q.poll();
	   answer[0] = 1;
       
	   for (i = 0; i < len - 1; i++) {
		   tTemp1 = q.poll();
		   
		   if (tTemp >= tTemp1) {
			   answer[ansc]++;
		   } else {
			   tTemp = tTemp1;
			   ansc++;
			   answer[ansc] = 1;
		   }	   
	   }

 

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
   
	   int i = 0, len = progresses.length;
	   int[] tdiv = new int[len];
	   int tDiv = 0, Temp = 0 ,tTemp = 0, tTemp1 = 0, count = 0, count1 = 1, ansc = 0;
	   
	   Queue<Integer> q = new LinkedList<Integer>();
	   
	   for(i = 0; i < len; i++) {
		   tDiv = (100 - progresses[i]) / speeds[i];
		   
		   if (((100 - progresses[i]) % speeds[i]) != 0)
			   tDiv++;
		   
		   if(tDiv > Temp) {
			   Temp = tDiv;
			   count++;
		   }
		   q.add(tDiv);
		   
		   tDiv = 0;
	   }
	   
	   int[] answer = new int[count];
	   
	   tTemp = q.poll();
	   answer[0] = 1;
	   for (i = 0; i < len - 1; i++) {
		   tTemp1 = q.poll();
		   
		   if (tTemp >= tTemp1) {
			   answer[ansc]++;
		   } else {
			   tTemp = tTemp1;
			   ansc++;
			   answer[ansc] = 1;
		   }
		   
	   }
	   
	   return answer;
    }
}

'algorithm' 카테고리의 다른 글

[프로그래머스]더 맵게  (0) 2020.03.07
[프로그래머스]멀쩡한 사각형  (0) 2020.03.01
[프로그래머스]위장  (0) 2020.01.08
[프로그래머스]프린터  (0) 2020.01.02
[프로그래머스][1차]비밀지도  (0) 2019.12.23