프로그래머스_기능개발_스택/큐(java)
2019. 3. 21. 12:15ㆍ알고리즘문제/프로그래머스
기능개발
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/42586?language=java
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
solution - 1) 배열 이용
예전에 직접 푼 것?!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import java.util.ArrayList; import java.util.Arrays; class Solution { public int[] solution(int[] progresses, int[] speeds) { int[] dayOfend = new int[100]; int day = -1; for(int i=0; i<progresses.length; i++) { while(progresses[i] + (day*speeds[i]) < 100) { day++; } dayOfend[day]++; } return Arrays.stream(dayOfend).filter(i -> i!=0).toArray(); } } | cs |
solution - 2) 큐 이용
다른 블로그 참고한건데 어렵다 ㅜㅜ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import java.util.*; class Solution { public int[] solution(int[] progresses, int[] speeds) { Queue<Integer> q = new LinkedList<Integer>(); //q의 사이즈는 poll 수행시 변경되므로 for문에서 고정조건으로 사용할 시 변수에 사이즈를 따로 담아둔다. int num = 0; int len = progresses.length; for(int i = 0; i <= len; i++) { if(i == len) { q.add(num); break; } if(progresses[i] >= 100) { num++; continue; } if(num != 0) { q.add(num); } num = 0; int remain = 100 - progresses[i]; int day = remain / speeds[i]; // 100프로 달성까지 걸리는 일수 if(remain % speeds[i] != 0) day++; for(int j = i; j < len; j++){ progresses[j] += (day * speeds[j]); } num++; } int[] answer = new int[q.size()]; for(int i = 0; i < answer.length; i++){ answer[i] = q.poll(); } return answer; } } | cs |
solution - 3) 큐 이용
큐를 이용해야겠다 생각하고 내가 이렇게 풀면 좋겠다 싶었던 방식
나는 해결 못하다가 다른 사람이 같은 방식으로 푼것을 발견했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; class Solution { public int[] solution(int[] progresses, int[] speeds) { Queue<Integer> q = new ConcurrentLinkedQueue<Integer>(); for(int i = 0; i < progresses.length; i++) { q.add((100-progresses[i])%speeds[i] == 0? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1); } List<Integer> result = new ArrayList<Integer>(); int standard = q.poll(); int cnt = 1; while(!q.isEmpty()) { int num = q.poll(); if(standard >= num) { cnt++; }else { result.add(cnt); cnt = 1; standard = num; } } result.add(cnt); int[] answer = new int[result.size()]; for(int i = 0; i < answer.length; i++) { answer[i] = result.get(i); } return answer; } } | cs |
'알고리즘문제 > 프로그래머스' 카테고리의 다른 글
프로그래머스_단어변환_깊이/너비우선탐색(java) (0) | 2019.03.21 |
---|---|
프로그래머스_가장 먼 노드_그래프(java) (0) | 2019.03.21 |
프로그래머스_쇠막대기_스택(java) (0) | 2019.03.20 |
프로그래머스_문자열_내마음대로_정렬하기(java) (0) | 2019.03.05 |
프로그래머스_서울에서_김서방_찾기_level1(java) (0) | 2019.03.03 |