-
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
문제
해당 문제는 작업의 진도와, 작업 속도가 주어졌을 때 함께 배포가 가능한 작업의 수를 작업 순서별로 구하는 문제다.
조건
작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.풀이
해당 문제는 카테고리가 큐 스택이라서 큐를 이용해서 해결했다. 먼저 처음 작업 진도에 대해서 남은 작업량을 구한 뒤 해당 작업의 작업 속도로 나누었을 때 걸리는 시간을 큐에 넣어준다. 이후 첫 번째 값은 따로 저장하고 나머지 값들은 큐가 빌 때까지 빼주면서 현재 저장된 일자보다 작으면 같이 배포가 가능하고 그렇지 않으면 다음 일정에 배포해주는 식으로 카운트를 측정하여 최종적으로 출력해주었다.
코드
import java.util.LinkedList; import java.util.Queue; class Solution { public int[] solution(int[] progresses, int[] speeds) { int[] days = new int[progresses.length]; Queue<Integer> q = new LinkedList<Integer>(); int day = 0, totalday = 0, index = 0; for (int i = 0; i < progresses.length; i++) { // 작업 수행 100프로까지 몇일 걸리는지 계산해서 큐에 추가 day = 100 - progresses[i]; q.offer(day%speeds[i] == 0 ? day/speeds[i] : day/speeds[i]+1); } totalday = q.poll(); // 첫번째 작업 걸린 일수 저장 days[index]++; // 첫번째 작업 배포 완료 while(!q.isEmpty()) { // 큐가 빌때까지 반복 int n = q.poll(); if(n <= totalday) { // totalday에는 현재까지 총작업일수가 저장되어있음 작으면 이전 작업 배포와 같이 가능 days[index]++; }else { // 이전 작업 이후에 새로 배포해주어야함 days[++index]++; totalday = n; } } int[] answer = new int[index+1]; for (int i = 0; i <answer.length; i++) { answer[i] = days[i]; } return answer; } }
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
728x90'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 가장 큰 수 JAVA (0) 2022.03.08 프로그래머스 K번째수 JAVA (0) 2022.03.08 프로그래머스 로또의 최고 순위와 최저 순위 JAVA (0) 2022.02.13 프로그래머스 해시 완주하지 못한 선수 JAVA (0) 2021.10.31 프로그래머스 해시 전화번호 목록 JAVA (0) 2021.10.31 댓글