[프로그래머스](lv.2) 기능개발 (java)

0

코딩테스트

목록 보기
12/37
post-thumbnail

<문제>

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

<나의 풀이>

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

// 예시 
		int[] progresses = {95, 90, 99, 99, 80, 99};
        int[] speeds = {1, 1, 1, 1, 1, 1};
 // int[] progresses = {90, 30, 55};
//  int[] speeds = {1, 30, 5};        
//  int[] progresses = {20, 99, 93, 30, 55, 10};
//  int[] speeds = {5, 10, 1, 1, 30, 5};

class Solution {
    public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
Stack<Integer> workDays = new Stack<>();
        ArrayList<Integer> answer = new ArrayList<>();
        // stack에 남은 작업 기간 담아주기
        for (int i = progresses.length - 1; i >= 0; i--) {
            int p = progresses[i];
            int workday = 0;
            while (p < 100) {
                p = p + speeds[i];
                workday++;
            }
            workDays.push(workday);
        }
        // 배포 가능 기능 수 세어주기
        int cnt = 1;
        int maxDay = workDays.peek();
        while (!workDays.isEmpty()) {
            int workday = workDays.pop();
            if (!workDays.isEmpty()) {
                if (workday >= workDays.peek() || maxDay>workDays.peek()) {
                    cnt++;
                } else {
                    answer.add(cnt);
                    cnt = 1;
                    maxDay = workDays.peek();
                }
            } else {
                answer.add(cnt);
            }
        }
        return answer;
    }
}

<다른 사람의 풀이>

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        List<Integer> answerList = new ArrayList<>();

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

            if (!q.isEmpty() && q.peek() < date) { // 근데 여기도 조금 수정해야 할 것 같다.
                answerList.add(q.size());
                q.clear();
            }

            q.offer(date);
        }

        answerList.add(q.size());

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

        for (int i = 0; i < answer.length; i++) {
            answer[i] = answerList.get(i);
        }

        return answer;
    }
}

<핵심 개념>

프로그래머스 고득점 Kit의 스택, 큐 문제이다. 근데 스택 쓰고싶어서 스택으로 써서 풀었는데 시간초과로 틀렸다. 그래서 다른 사람 풀이를 봤는데 거의 스택 큐를 안썻길래 그 중에 스택, 큐로 쓴 풀이를 가져왔다. 나는 남은 작업일을 스택에 넣어서 다시 빼주는 구조로 코드를 짯는데 이 분은 남은 날과 배포 기능을 세는 일을 한번에 하는 코드로 짜셨다. 훨씬 효율적인 것 같다. 근데 내가 문제이해를 못한건지 긴가민가한 부분이 있어서 리펙토링을 해봐야 될 것 같다.
아직 Lv2는 많이 어렵다.

profile
두둥탁 뉴비등장

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기