과일 장수 (자바)

김재현·2023년 11월 23일
1

알고리즘 풀이

목록 보기
26/90
post-thumbnail

문제

정답 코드

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        
         List<Integer> arr = new ArrayList<>();

        for (int i : score) {
            arr.add(i);
        }

		//역순 정렬
        Collections.sort(arr,Collections.reverseOrder());

		//박스 개수 계산
        int boxes = arr.size() / m;

        for (int i = 1; i < boxes+1; i++) {
            int boxLast = arr.get((i * m)-1);
            answer += boxLast * m;
        }
        
        return answer;
    }
}

ArrayList로 바꾼 뒤 역순으로 정렬했다.
그 다음 박스의 개수를 계산 해놓고,
for문으로 박스의 개수만큼 돌아가게 설정.
(박스가 0일 때는 for문이 돌아가지 않아, answer==0)

박스에 들어가는 가장 작은 과일의 값(arr.get(m-1))과 m을 곱하여 answer에 더해준다.
이것을 m번째마다 반복해야하니, (arr.get(m*i-1)) 이 된다.

오답 코드

         List<Integer> arr = new ArrayList<>();

        for (int i : score) {
            arr.add(i);
        }

        Collections.sort(arr,Collections.reverseOrder());
        
       while(arr.size()>=m) {
           int boxLast=0;
           int count=0;
           for (int i=0;i<m;i++) {
               if (!arr.isEmpty()) {
                   boxLast = arr.get(0);
                   arr.remove(0);
                   count++;
               }
           }
           answer+=boxLast*count;
       }

처음에는 while문을 이용했을 때, 시간이 초과되었다.
이제 슬슬 속도도 중요한 시점이 되어가는 것 같다.

다른 사람 풀이

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;

        Arrays.sort(score);

        for(int i = score.length; i >= m; i -= m){
            answer += score[i - m] * m;
        }

        return answer;
    }
}

score를 오름차순으로 sorting 한뒤,
for문으로 돌리되, i의 시작을 score의 크기로 선언.
i를 m씩줄여나간다.

내 풀이와 개념은 비슷하나, 변환 없이 더 간결하게 풀었다.

profile
I live in Seoul, Korea, Handsome

0개의 댓글