본문 바로가기

개발공부/프로그래머스 뽀개기

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

- 처음에 문제 이해를 잘못해서 바로전의 숫자보다만 크게 짰었다

  그게 아니라 맨앞의 수랑 비교해서 한번에 나가는 것을 계산해줘야한다.

- 맨앞의 수보다 큰 값을 만나면 다시 comp수 초기화해서 이 수와 비교

 

- 동시 배포 갯수를 보내는것!!

- 스택/ 큐 부분 문제라 굳이 큐를 썼는데 다른 방법이 더 깔끔할듯..

 


추가 케이스 예제를 참고하고 다시 풀어보자 (프로그래머스 boniato님 참고)

예제 1)
progresses : [40, 93, 30, 55, 60, 65]
speeds : [60, 1, 30, 5 , 10, 7]
return : [1,2,3]

 

예제 2)
progresses : [93, 30, 55, 60, 40, 65]
speeds : [1, 30, 5 , 10, 60, 7]
return : [2,4]


package algo;

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

public class stackque3 {
	public static void main(String args[]) {

		int[] progresses = {93, 30, 55, 60, 40, 65};
		int[] speeds = {1, 30, 5 , 10, 60, 7};

		System.out.println(solution(progresses, speeds));

	}

	public static int[] solution(int[] progresses, int[] speeds) {
		int[] answer = {};

		Queue<Integer> line = new LinkedList<Integer>();
		ArrayList<Integer> ans = new ArrayList<Integer>();

		for (int i = 0; i < progresses.length; i++) {
			int mod = (100 - progresses[i]) % speeds[i]; //나머지 구하기
			int time =0;
			
			if( mod == 0){
				time = (100 - progresses[i]) / speeds[i];	
			}
			else {
				time = (100 - progresses[i]) / speeds[i]+1;	//나머지가 있으면 한번더 돌아야하니까 1추가 
			}
			line.offer(time); // 걸리는 시간 값을 구했으니 큐에 넣어준다
		}
		
		int comp = line.peek(); //맨처음꺼가 기준이된다 
		line.poll(); // 그다음꺼 접근위해 out
		int anss =1; //배포갯수 1개 획득!
		
		while(line.size()>=1) {	 // 사이즈가 1일 동안
			if(comp>=line.peek()) { //기준이 되는 값이 지금 맨 위의 값보다 크면 통과할수 있으니까
				anss += 1; //배포갯수 1개 획득!
				line.poll();// 다음꺼 구하기 위해 out
			} 
			else { // 지금값이 비교값보다 크면 통과X 니까
				ans.add(anss);//여태 모았던 값 답이 들어가는 리스트에 추가
				comp =line.peek(); // 비교값 새로 등록
				line.poll(); //다음꺼 구하기 위해 out
				anss =1; //배포갯수 1로 초기화	
			}	
		}
		ans.add(anss); // 마지막에 남은 값 추가.
		
		answer = new int[ans.size()];
		
		  for(int i=0; i<ans.size();i++) { //배열로 변환해서 넣어준다
			 answer[i]= ans.get(i);
			 //System.out.println(answer[i]);
		}
		 
		 
		return answer;
	}
}