코딩 테스트/자료구조
[프로그래머스] 42586 기능개발(Lv2) - 배열(스택, 큐)
토자맨
2024. 6. 28. 23:32
문제
입출력 예시
코드
(100 - progresses[i]) / speeds[i]
(100 - progresses[i]) % speeds[i]
를 이용하여 작업 시간을 구한다.현재 작업의 종료 시간 >= 다음 작업의 종료 시간
이라면 다음 작업을 대기시켰다 현재 작업 배포 시기에 함께 배포해야 하므로 배포되는 기능의 개수인cnt++
- 2에서 현재 작업 시간에 배포되는 기능의 개수를 모두 구했다면 answer 리스트에
add()
- answer 리스트 반환
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1. ---------------------------------------------------------
// 작업 기간(end) 계산
int[] end = new int[progresses.length];
for (int i = 0; i < progresses.length; i++) {
int intg = (100 - progresses[i]) / speeds[i];
float flt = (100 - progresses[i]) % speeds[i];
// 각 작업의 완료 기간 설정
if (flt == 0) {
end[i] = intg;
}
else {
end[i] = intg+1;
}
}
// 2. ---------------------------------------------------------
// 기능 배포 개수 계산
ArrayList<Integer> answer = new ArrayList<>();
int front = 0;
while (front < end.length) {
int cnt = 1;
/**
if, 비교 대상 < 배열 크기 && 앞 > 비교 대상
then, 배포 개수++(자기 자신 + 비교 대상)
**/
// 이 부분 for로 했는데 막혀서 gpt 참조함
// for 반복문 + if 조건문보단 while로 반복과 조건 한번에 하는 게 적절
while (front + cnt < end.length && end[front] >= end[front + cnt]) {
cnt++;
}
/**
if, 비교 대상이 더 크다면
then,
지금까지 센 cnt를 answer에 삽입
&&
자기 자신을 비교 대상으로 전환
**/
// 3. ---------------------------------------------------------
answer.add(cnt);
front += cnt;
}
// 출력을 위해 ArrayList<Integer>를 int[]로 변환
int[] result = new int[answer.size()];
for (int j = 0; j < answer.size(); j++) {
result[j] = answer.get(j);
}
return result;
}
}
결론
스택/큐 문제지만 배열을 이용하여 간단하게 풀 수 있어서 배열을 이용해 풀어봤다.