본문 바로가기
Algorithm PS (JAVA)/Stack & Queue

[JAVA/Programmers] 42586 기능개발 (자바/프로그래머스)

by ʚ⇜❅🎕̈❄⇝ɞ 2024. 5. 24.
728x90
반응형

Programmers 프로그래머스 42586 기능개발 문제는 작업 진도와 속도가 주어졌을 때, 각 배포마다 몇 개의 기능이 배포되는지 구하는 문제이다. 스택/큐 유형의 문제로 난이도는 Level 2이다.

 

Programmers 42586 기능개발 문제 정보

출처

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

알고리즘 분류

- 스택/큐 (Stack/Queue)

난이도

- Level 2

 

주요 개념

  • Queue 자료구조는 선입선출 (FIFO: First In First Out) 구조이다.
  • 값 삽입
    • add(value): 실패 시 Exception 발생
    • offer(value): 실패시 false 반환
  • 값 삭제
    • remove(): Empty Queue 면 Exception 발생
    • remove(value): 값이 존재하지 않으면 false 반환
    • poll():  Empty Queue 면 null 반환
  • 값 조회
    • element(): Empty Queue 면 Exception 발생
    • peak(): Empty Queue 면 null 반환
  • isEmpty(): Empty Queue 면 true, 아니면 false 반환
  • size(): Queue 의 크기(원소 개수) 반환
  • clear(): Queue 비우기
  • contains(value): Queue 내에 값이 존재하면 true, 아니면 false
728x90

문제 풀이 과정

  • 각 프로세스 별로 배포 날까지 며칠이 남았는지 계산하여 Queue에 추가한다.
  • 배포할 프로세스의 남은 일 수를 변수(prevDay)에 저장해 놓고
  • Queue 에서 poll 하여 비교하여 같이 배포할 프로세스 수를 카운트한다.
  • 남은 일 수가 더 많이 남은 프로세스를 만나면 다음에 배포하기 위해 변수(prevDay)에 덮어쓰고
  • 카운팅 한 값을 배포 개수 배열(counts)에 add 하고 초기화한다.
  • 위 과정을 Queue 가 빌 때까지 반복한다.
  • while을 다 돌면 마지막 배포 개수를 add 해준다.

주의

배포 날까지 남은 일 수 구할 때 나눠 떨어지지 않으면 +1 해주어야 한다.

나눈 값을 double로 변환하여 소수 점을 올림하는 Math.ceil()을 써도 되고,

필자는 나머지가 있으면 +1 하여 int로 관리하였다.

 

case 11 반례

progresses: [94, 93]

speeds: [2, 2]

return: [1, 1]

반응형
코드 및 설명
// Queue
public static int[] solution_Queue(int[] progresses, int[] speeds) {
    int[] answer = {};

    List<Integer> counts = new ArrayList<>();
    Queue<Integer> days = new LinkedList<>();

    // 배포까지 남은 일 수 계산
    for (int i = 0; i < progresses.length; i++) {
        days.offer(calculateRemainDay(progresses[i], speeds[i]));
    }

    // 각 배포마다 몇 개의 기능이 배포되는지 구하기
    int cnt = 0;
    int prevDay = days.peek();
    while (!days.isEmpty()) {
        Integer nowDay = days.poll();
        if (nowDay <= prevDay) {
            cnt++;
            continue;
        }
        counts.add(cnt);
        prevDay = nowDay;
        cnt = 1;
    }
    counts.add(cnt);

    // return 형식에 맞게 형변환
    answer = counts.stream().mapToInt(Integer::intValue).toArray();
    return answer;
}

// Array
public static int[] solution_Array(int[] progresses, int[] speeds) {
    int[] answer = {};

    List<Integer> counts = new ArrayList<>();
    int[] days = new int[progresses.length];

    // 배포까지 남은 일 수 계산
    for (int i = 0; i < progresses.length; i++) {
        days[i] = calculateRemainDay(progresses[i], speeds[i]);
    }

    // 각 배포마다 몇 개의 기능이 배포되는지 구하기
    int cnt = 0;
    int prevDay = days[0];
    for (int day : days) {
        if (day <= prevDay) {
            cnt++;
            continue;
        }
        counts.add(cnt);
        prevDay = day;
        cnt = 1;
    }
    counts.add(cnt);

    // return 형식에 맞게 형변환
    answer = counts.stream().mapToInt(Integer::intValue).toArray();
    return answer;
}

// 배포까지 남은 일 수 계산
private static int calculateRemainDay(int progresses, int speeds) {
    int remainDay = (100 - progresses) / speeds;
    if ((100 - progresses) % speeds == 0) {
        return remainDay;
    }
    return remainDay + 1;
}

 

관련 문제

[JAVA/Programmers] 12909 올바른 괄호 (자바/프로그래머스)

 

[JAVA/Programmers] 12909 올바른 괄호 (자바/프로그래머스)

Programmers 프로그래머스 12909 올바른 괄호 문제는 '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호인지 구하는 문제이다. 스택/큐 유형의 문제로 난이도는 Level 2이다. P

wondytyahng.tistory.com


 

Programmers 프로그래머스 42586 기능개발 문제를 자바 Java로 풀어보았다. 난이도는 Level 2이다.

728x90
반응형

댓글