Codewars 문제풀기 (05/29)
The Supermarket Queue
-
int[] customers, int n을 입력으로 받는다.
- customers의 length는 customer 수, 각 value는 처리하는데 걸리는 시간이다.
- n은 계산 카운터 개수이다.
-
모든 customer를 처리하기 위한 시간을 리턴한다.
solveSuperMarketQueue([5,3,4], 1) 👉 계산 카운터가 1개이므로 5 + 3 + 4 👉 12 solveSuperMarketQueue([10,2,3,3], 1) 👉 계산 카운터가 2개인데 첫번째 손님 처리가 끝나기 전에 2,3,4번째 손님이 끝난다. 그러므로 👉 10
1. Test와 리팩토링
-
테스트 1 - 입력이 [1,2,3,4,5], 1일때 15를 리턴한다.
-
테스트 2 - 입력이 [2,2,3,3,4,4], 2일때 9를 리턴한다.
- 실제 코드
- 아이디어 : 큐를 생성하여 큐에 customer time을 넣는다. 그러고 길이가 n인 배열(tills)을 생성하여 queue에서 값을 꺼내 차례대로 넣는다. 그 후 tills의 원소중 최소값을 찾아 결과값에 더해주면서 반복한다. 큐에서 차례대로 다 빼내서 큐가 비었을때 가장 tills에서 가장 큰 값을 더해준다.
- 리팩토링
- queue를 만드는 부분을 메서드로 추출했다. for문 내에서도 메서드를 추출하고 싶었는데 파라미터로 queue, int[]를 모두 사용해야해서 좀 골치아팠다. 그래서 그냥 뒀다..
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
import java.util.Arrays;
public class Solution {
public static int solveSuperMarketQueue(int[] customers, int n) {
int[] result = new int[n];
for(int i = 0; i < customers.length; i++){
result[0] += customers[i];
Arrays.sort(result);
}
return result[n-1];
}
}
-
sort 메서드를 사용했다. 처음에 보고 뭐지 생각했는데 아이디어는 이거다.
-
tills 배열에서 최솟값에 다음 customer의 처리시간을 더한다.
- 계속 반복하면 tills중 가장 큰 값이 최종 시간이다.
- 시간이 가장 짧은 till에 다음 cutomer가 붙으니까 당연한 얘기이다.
- 근데 그 당연한 생각을 못했다… ㅂㄷㅂㄷ
-
-
queue만들고 하드코딩하고 반복되는 부분 반복문으로 루프 만들고 했는데.. 너무 쉽게 풀어서 좀 허탈하다 ㅜㅜ
댓글남기기