smooth waters run deep

1d-1c/Programmers

Level2_기능개발 (C++) (JAVA)

yeon_11 2020. 11. 5. 11:49
 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

[C++] : 큐로 구현

#include <vector>
#include <queue>
using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
	queue<int> days; //걸리는 시간 저장
	vector<int> answer;

	int max_day;
	int cnt = 1; //answer에 넣을 값
	bool flag = false; //answer에 넣었는지 확인하기 위한 flag

	if (progresses.size() > 0 && progresses.size() <= 100 && speeds.size() > 0 
    && speeds.size() <= 100){

		for (int i = 0; i < progresses.size(); i++){ //걸리는 시간 저장
			int day = (100 - progresses[i]) / speeds[i];
			if ((100 - progresses[i]) % speeds[i] != 0){
				day += 1;
			}
			days.push(day);
		}

		max_day = days.front(); //제일 앞에 있는 거를 최댓값이라고 생각
		days.pop();

		if (days.size() == 1){
			answer.push_back(cnt);
		}

		else if (days.size() > 1 && days.size() <= 100){
			while (!days.empty()){
				if (max_day >= days.front()){ //기준값보다 작으면 pop, cnt++
					days.pop();
					cnt++;
					flag = false;
				}
				else{ //기준값보다 크면: 기준값바꾸고 cnt값 answer에 추가, cnt 초기화
					max_day = days.front();
					days.pop();
					answer.push_back(cnt);
					flag = true;
					cnt = 1;

					if (days.empty()) flag = false;
						//answer.push_back(cnt); //큰 값이 마지막 숫자라면 answer에 1추가
				}
			}
			if (!flag) answer.push_back(cnt); //falg=false 이면 answer에 cnt 추가
		}

		return answer;
	}
}

 

 

[JAVA] : 스택으로 구현

import java.util.Stack;
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        for(int i=0; i<progresses.length; i++){
				progresses[i] = (int) Math.ceil((double)(100-progresses[i])/speeds[i]);
		}

		Stack<Integer> stack = new Stack<>();
		stack.push(progresses[0]);
        
		int cnt = 0;
		List<Integer> temp = new ArrayList<>();

		while(!stack.isEmpty()){
			for(int i=1; i< progresses.length; i++){
				int top = stack.peek();
                
				if(top >= progresses[i])
					cnt++;
				else{
					stack.pop();
					stack.add(progresses[i]);
					cnt++;
					temp.add(cnt);
					cnt = 0;
				}
                
				if(i==progresses.length-1 && !stack.isEmpty()){
					while(!stack.isEmpty()){
						stack.pop();
						cnt++;
					}
					temp.add(cnt);
				}
			}
		}

		int[] answer = new int[temp.size()];
		for(int i=0; i<temp.size(); i++){
			answer[i] = temp.get(i);
		}
		return answer;
    }
}

 

 

Math.ceil() : 올림
Math.round() : 반올림

 

이 문제를 통해 내가 반올림과 올림을 혼동해서 사용하고 있음을 알게됐다.

Math.round()를 사용해서 계속 테스트 실패 도돌이표에 빠졌다가 겨우 빠져나왔다..!

 

'1d-1c > Programmers' 카테고리의 다른 글

Level1_실패율 (C++) (JAVA)  (0) 2020.12.09
Level2_카카오프렌즈 컬러링북 (JAVA)  (0) 2020.11.05
Level1_체육복 (JAVA)  (0) 2020.11.02
Level1_모의고사 (JAVA)  (0) 2020.11.02
Level1_예산 (JAVA)  (0) 2020.11.02