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

Yellta·2024년 5월 22일
0

알고리듬리듬

목록 보기
6/20

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

import java.util.*;
import java.io.*;

/*
[문제]
기능은 진도가 100일때 배포 가능
각 기능의 개발속도는 모두 다르다.
profresses - 먼저 배포되어야하는 순서대로 작업의 진도가 적힌 정수배열
speeds 각 작업의 개발속도

[입력]
배열의 길이는 100개 이하
진도는 100 미만의 자연수
작업 속도는 100'이하'의 자연수 - 한 번에 작업완료 가능
배포는 하루에 한 번만 할 수 있다

[IDEA]
stack사용

1. 배포 일자가 담긴 배열A 만들기
3. A배열 2번부터 순회하면서 stack에 값 넣기
    - if(max < A[x])
        max = A[x];
        stack 사이즈 결과에 넣기
        stack비우기
        stack.push(A[x])수행
    -if (max>=A[x]) stack에 push

*/

class Solution {
    public List<Integer> solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        List<Integer> A = new ArrayList<>();
        
        //일자 배열 만들기
        for(int i=0; i<progresses.length; i++){
            int count =0;
            while(progresses[i]<100){
                progresses[i] = progresses[i]+speeds[i];
                count++;
            }
            A.add(count);
        }
      
        Stack<Integer> stack = new Stack<>();
        int max=0;
        
        for(int i=0; i<A.size(); i++){
            if(stack.empty()){
                stack.push(A.get(i));
                max = A.get(i);
                
            }else if(max <A.get(i)){
                
                answer.add(stack.size());
                while(!stack.empty())stack.pop();
                stack.push(A.get(i));
                max = A.get(i);
                
            }else {
                stack.push(A.get(i));
            }
            
        }
        //모두 동시에 배포되는 경우 
        //날짜 배열이 모두 같은 경우이다.
        int size = stack.size();
        Boolean flag = true;
        
        int x=stack.peek();
        for(int i=0; i<size; i++){
            if(x!=stack.peek())flag = false;
            stack.pop();
        }
        
        if(!flag)answer.add(size);
        else answer.add(1);

        return answer;
    }
}

살짝 갈피를 못잡을 뻔했다가? 프로그래머스에서 대놓고 힌트 보여줘서 나쁘지 않게 풀은 문제

남은 일수는 각각 5,10,1,1,20,1일 입니다

입출력의 예시로 저걸 보여줬다는 것은 저걸 가지고 문제를 풀이할 수 있다는 의미이다.

예시 2번으로 문제를 풀면 위와같은 풀이가 나오게 된다.

형광펜으로 칠해진 곳은 분기가 발생하는 곳이다.

stack의 값을 모두 비우고

새롭게 max를 지정하고

새로운 값을 push한다.

A배열 2번부터 순회하면서 stack에 값 넣기
    - if(max < A[x])
        max = A[x];
        stack 사이즈 결과에 넣기
        stack비우기
        stack.push(A[x])수행
    -if (max>=A[x]) stack에 push

주석에서 이부분에 해당한다.

하지만 저렇게 짠다고해서 완성되는 것은 아니다.

잊지말자 언제나 예외는 존재한다.


[입력]
배열의 길이는 100개 이하
진도는 100 미만의 자연수
작업 속도는 100'이하'의 자연수 - 한 번에 작업완료 가능
배포는 하루에 한 번만 할 수 있다

프로그래머스 제한조건에 해당하는 부분이다.

작업 속도는 100이하의 자연수 즉 모든 작업이 한 번에 완료되는 경우도 발생할 수 있다는 경우이다.

그래서 테스트케이스를 넣어봤더니 내가짠 로직만으로는 모든 경우를 체크하기엔 조금 부족함이 있었다.

이리저리 넣어본 테스트케이스

 //모두 동시에 배포되는 경우 
        //날짜 배열이 모두 같은 경우이다.
        int size = stack.size();
        Boolean flag = true;
        
        int x=stack.peek();
        for(int i=0; i<size; i++){
            if(x!=stack.peek())flag = false;
            stack.pop();
        }
        
        if(!flag)answer.add(size);
        else answer.add(1);

        return answer;

따라서 해당 코드가 필요한 것

모두 같이 배포가 되려면

배포날짜 배열 A의 값이 모두 같다. 즉 A=[n,n,n]의 경우

해당 날짜는 Boolean값을 줘서 결정한다.(내가 자주사용하는 방법임)

값을 하나씩 뽑아가면서 비교한후 값이 다르면 false(stack의 남은 사이즈를 추가로 넣으면 되는 경우)

같으면 true (1을 출력하면 되는 경우)


Review

언제나 항상 틀리는 것이 있다.

나는 코테를 풀 때 꽤나 그럴싸한 로직을 다행스럽게도 생각해 내는 것 같지만 언제나 예외를 생각못해서 틀리는 것 같다.

그래서 예외를 항상 짜려고 노력하는데 그것도 잘 안돼서 속상하기도하다

그래도 해야지…

엉어어어엉

profile
Yellta가 BE개발해요! 왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜 가 제일 중요하죠

0개의 댓글