progresses[] 와 speeds[]에 따른 기능 구현.
핵심은, 앞의 기능이 100이 될때까지 뒤에있는 기능들은 배포가 안되고 대기.]
필자는 테스트케이스11에서 막혀서 다른 코드를 참고하였다.
필자코드
import java.util.Stack;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Stack<Integer> stack = new Stack<>();
int check = 0;
int a=0;
while(check < progresses.length) {
int count= 0;
if(check<progresses.length && progresses[check] > 100 ){
while(check<progresses.length && progresses[check]> 100){
count ++;
check++;
}
stack.push(count);
a++;
}
//각각 증가
for (int i = 0; i < progresses.length; i++) {
progresses[i] += speeds[i]; //각각 속도만큼 증가
}
}
int[] answer = new int[stack.size()];
int stack_size = stack.size();
for(int i = 0; i<stack_size; i++){
answer[(stack_size-1) - i] = stack.pop();
}
return answer;
}
무엇이 잘못되었는지, 테스트케이스 11이 무엇인지 몰라서 찾지 못하였다.
그리고, 마지막에 answer 값을 가져오는 과정 中, 스택이 아니라 queue를 사용했더라면 FIFO방식이 좀 더 적합했을거라는 아쉬움이 남는다.
다른 개발자의 코드 중 참고할만한 스트림 풀이
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();
}
}
무척이나 짧기 때문에, 예술적이다.. 문제에 최대 100개의 배열길이 정해져있어서 가능했고, 위에서 그렇게 미리 100개를 선언하기때문에 공간낭비도 있지만 stream의 filter를 이용한다는 점에서 의의가 있다.
<위 스트림풀이의 IDEA>
각각의 progresses[i]에 대하여 각 speeds[i]를 통해 며칠이 걸리는지 카운팅한다.
예를들어 progresses[0] 과 progresses[3]이 5일이 걸리면 dayofEnd[5] = 2이다.
dayofEnd[걸리는날짜] = 해당하는 progress 카운팅
그리고, filter(i-> i!=0) 을 통해서 dayofEnd의 배열값이 0이 아닌것들만 배열로 변환한다.
이때, 문제에서 요구한 "앞에 있는 기능부터 배포"가 당연히 배열의 인덱스값이 작은순서부터 추출되므로
조건에 부합한 출력방식이 된다.
Ex)
dayofEnd[5] | dayofEnd[10] | dayofEnd[20] |
2 | 1 | 3 |
이런식으로 카운팅 값이 들어가 있으면
return { 2, 1, 3} 으로 배열이 들어가게 된다.
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 스택/큐 "프린터" (0) | 2020.09.09 |
---|---|
[JAVA] 스택/큐 "다리를 지나는 트럭" (0) | 2020.09.07 |
[JAVA] 스택/큐 "주식가격" (0) | 2020.09.05 |
[JAVA] 해시 "위장" (0) | 2020.08.31 |
[JAVA] 해시 "전화번호 목록" (0) | 2020.08.31 |