조앤의 기술블로그
[프로그래머스 / 스택&큐] 기능 개발(java) 본문
[문제]
문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
입출력 예
progressesspeedsreturn
[93,30,55] | [1,30,5] | [2,1] |
입출력 예 설명
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
[1차 실패 코드]
import java.util.*;
class Solution {
static int getDate(int p, int s){
int tmp = (100 - p) % s;
if(tmp == 0)
return (100 - p) / s;
else
return ((100 - p) / s) + 1;
}
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
//stack
int n = progresses.length;
int[] date = new int[n];
for(int i = 0; i < n; i++ ){
date[i] = getDate(progresses[i], speeds[i]);
}
Stack<Integer> stack = new Stack<>();
stack.add(1); //첫번째 작업
for(int i=1; i<=n; i++){
if(date[i-1] <= date[i])
stack.add(1);
else{
int num = stack.pop();
num += 1;
stack.add(num);
}
}
answer = new int[stack.size()];
int i = 0;
for(int d : stack){
answer[i] = d;
i++;
}
//List 를 쓰면 내가 고민했던 문제를 쉽게 해결할 수 있다.
//나랑 풀이 같은 것 같은데 왜 나는 틀리는거지..
// 세심한 조건,예외 이런것이 문제...
// 큰 접근 방식은 이제 어느정도 근접한것 같은데 그래도 정답은 아님..
// 완벽하려면 완벽하게 생각해 철저하게.
// 이것도 맞는 것 같은데 왜 틀리지 ㅜㅜ
return answer;
}
}
1차 실패 후 구글 참고
https://heedipro.tistory.com/232
문제점은 이전 것이랑만 비교한다는 것이었음
테스트케이스 통과 갯수가 늘어나긴 했으나
100% 통과는 아니었다.
import java.util.*;
class Solution {
static int getDate(int p, int s){
int tmp = (100 - p) % s;
if(tmp == 0)
return (100 - p) / s;
else
return ((100 - p) / s) + 1;
}
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
//stack
int n = progresses.length;
int[] date = new int[n];
for(int i = 0; i < n; i++ ){
date[i] = getDate(progresses[i], speeds[i]);
}
Stack<Integer> stack = new Stack<>();
stack.add(1); //첫번째 작업
int standard = date[0]; //추기
for(int i=1; i<n; i++){
if(standard <= date[i]){
stack.add(1);
standard = date[i];//추가
}
else{
int num = stack.pop();
num += 1;
stack.add(num);
}
}
answer = new int[stack.size()];
int i = 0;
for(int d : stack){
answer[i] = d;
i++;
}
return answer;
}
}
[정답코드]
import java.util.*;
class Solution {
static int getDate(int p, int s){
int tmp = (100 - p) % s;
if(tmp == 0)
return (100 - p) / s;
else
return ((100 - p) / s) + 1;
}
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
//stack
int n = progresses.length;
int[] date = new int[n];
for(int i = 0; i < n; i++ ){
date[i] = getDate(progresses[i], speeds[i]);
}
Stack<Integer> stack = new Stack<>();
stack.add(1); //첫번째 작업
int standard = date[0];
for(int i=1; i<n; i++){
if(standard < date[i]){
stack.add(1);
standard = date[i];
}
else{
int num = stack.pop();
num += 1;
stack.add(num);
}
}
answer = new int[stack.size()];
int i = 0;
for(int d : stack){
answer[i] = d;
i++;
}
return answer;
}
}
비교할 때 등호가 문제였다!!!!!!!!!!!! 왹왹
[문제링크]
https://programmers.co.kr/learn/courses/30/parts/12081
'Programming > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 힙] 라면공장 (java) ⭐️ (0) | 2020.03.18 |
---|---|
[프로그래머스 / 힙] 더 맵게(java) (0) | 2020.03.18 |
[프로그래머스] 124 나라의 숫자(java) ⭐️ (0) | 2020.03.17 |
[프로그래머스 / 스택&큐] 쇠막대기(java) (0) | 2020.03.16 |
[프로그래머스 / 스택&큐] 다리를 지나는 트럭 (java) (0) | 2020.03.14 |