프로그래머스 기능개발

박은빈·2022년 11월 10일

코딩

목록 보기
13/19

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

해결방식

처음에 보니 수학적으로 하면 빠르게 연산을 할 수있을거 같아서 수학적으로 풀이를 해보았다

먼저 93%까지 되고 하루에 1%씩하면 7일후에 100%가 된다
그리고 30%까지 된다음 하루에 30%씩하면 4일뒤에 100%초과가 된다

작업진도와 작업속도를 더했을때 정확히 100이되면
배포일은 "100-작업진도"이지만 두번째 경우처럼 100을 초과하는경우가 있다

그렇기때문에 나누기를 사용한다
두번째 경우로 예를들면
100-30 = 70이다
여기서 70/30을 하면 2.333..이 나오게된다
하지만 정확히 100이 아닌이상 그 뒤에 소수점이 어떻게 나오든 그 다음날에 배포를 해야되기때문에 "무조건 올림"이 나오게된다

그래서 배포일은 2.333에서 올림을 한 3이 되게된다
이러한 방법으로 for문을 돌려 각 배포일을 구해 배열 안에 집어넣었다

그리고 배포일에 배포가 되는 개수를 구하는건데

여기서 주의해야되는게 작업진도는 병렬적으로 이루어진다
100m달리기를할때 한명한명 따로 출발하는게 아니라 동시에 출발하는것처럼
각 작업은 동시에 시작하지만 스피드가 달라 배포일이 달라진다

여기서 첫번째 배포가 7일걸리는데 두번째 배포는 3일이 걸린다면
첫번째 배포가 되는 7일의 시점에 두번째 배포도 같이 이루어진다

만약 그 다음 배포가 8일이 걸린다면 이 배포는 다음 배포일로 따로 생성되게 된다

0번째는 무조건 첫번째 배포이기때문에 max에 넣어주고
배포일의 배열을 for문으로 돌려주었다

그리고 그 안에서 기준 배포일보다 작거나 같을경우(기준 배포일과 합쳐져서 배포되야될 경우) 스택에 카운트를 1추가하고 다시 push를 했다

그리고 그게 아니라면 기준 배포일보다 다음 배포일이 큰 경우
기준 배포일을 다음 배포일로 바꾼다음 스택을 추가시켰다

그리고 그 스택을 배열에 다시 집어넣는데
스택은 선입 후출이기때문에 배열에 집어넣을때 "반대로"집어넣어주었다

코드

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] proDay = new int[progresses.length];

        for(int i=0; i<progresses.length; i++) {
            double num = 100 - progresses[i];
            proDay[i] = (int)Math.ceil(num/speeds[i]);
        }

        Stack<Integer> stack = new Stack<>();

        stack.push(1);
        int max = proDay[0];
        int cnt = 1;

        for(int i=1; i< proDay.length; i++) {
            if(max >= proDay[i]) {
                cnt = stack.pop()+1;
                stack.push(cnt);
            } else{
                stack.push(1);
                max = proDay[i];
            }
        }

        int[] answer = new int[stack.size()];

        for(int i=stack.size()-1; i>=0; i--) {
            answer[i] = stack.pop();
        }

        return answer;
    }
}

Math.ceil을 통해 올림을 해 준다음 int형으로 강제 변환후 배열에 저장했다

먼저 스택에 1을 넣고(처음배포)
기준 배포일 max를 proDay(배포일 배열)[0]에 넣었다

for문을 통해 작거나 같을경우 pop한다음 카운트를 추가해 다시 넣어주었고

그게 아니라면 max를 다시 바꿔주고 새로운 push를 해주었다

총평

문제의 이해가 중요해서 문제를 이해하면 쉽게 풀수 있는 문제같다

그래도 코드는 꼼꼼하게 작성하자

profile
안녕하세요

0개의 댓글