본문 바로가기

Algorithm/프로그래머스

[ Java / 프로그래머스 ]귤 고르기

728x90
반응형

👨‍💻 아무생각없이 문제를 읽고 리스트에 담아서.. 크기별로 개수를 맵에 담은 다음에.. 그 개수를 다시 리스트에 담아서.. 정렬하고.. 역으로 돌린 다음에 순차적으로 더했을 때 k보다 같거나 크면 끝내 보자!!라는 생각을 하고 바로 코드를 짜보았다. 너무 길어지고 효율성도 너무 똥일 것같았지만 일단 해보았다. 레벨 2부터는 효율성도 따지길래 틀렸을 거라고 생각했는데 성공은 했다 ㅋㅋ

😅 살벌하다.. 메모리와 시간이 너무 비효율적이다. 나는 항상 독특하게 생각해서 코테 푸는게 재밌다. 하지만 개발자로써는 효율성을 중요하게 따져야하기 때문에 앞으로는 효율성을 따지면서 풀어봐야겠다.

int k = 6;
        int[] orange = {1, 3, 2, 5, 4, 5, 2, 3};
        List<Integer> list = new ArrayList<>();
        for(int value : orange) {
            list.add(value);
        }
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : list) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        List<Integer> countOrange = new ArrayList<>();
        map.forEach((number, counter) -> {
            countOrange.add(counter);
        });
        Collections.sort(countOrange);
        Collections.reverse(countOrange);
        int sum = 0;
        int temp = 0;
        for(int i=0; i<countOrange.size(); i++) {
            temp += countOrange.get(i);
            if(temp >= k) {
                sum++;
                break;
            } else {
                sum++;
            }
        }
        System.out.println(sum);

🙃 map.getOrDefault(num, 0)

num의 빈도를 map에 저장한다. num이 map에 없으면 0을 반환한다. 한 마디로 리스트 인덱스 값들의 개수를 값으로 인덱스 값을 키로 한다.

{1=1}
{1=1, 3=1}
{1=1, 2=1, 3=1}
{1=1, 2=1, 3=1, 5=1}
{1=1, 2=1, 3=1, 4=1, 5=1}
{1=1, 2=1, 3=1, 4=1, 5=2}
{1=1, 2=2, 3=1, 4=1, 5=2}
{1=1, 2=2, 3=2, 4=1, 5=2}

🙃 map.forEach

반복하면서 값을 리스트에 담아준다.

{1=1, 2=2, 3=2, 4=1, 5=2}

🙃 그 후에 큰 값들로 내림차순 리스트를 만들고 앞에부터 더해가면 최소의 종류를 구할 수 있다!!!!

 

➡️ 코드를 막 짜서 지저분해가지구 가독성 좋게 리팩토링 해보자

 

class Solution03 {
    public int solution(int k, int[] orange) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : orange) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        List<Integer> countOrange = new ArrayList<>(map.values());
        Collections.sort(countOrange, Collections.reverseOrder());

        int sum = 0, temp = 0;
        for(int count : countOrange) {
            temp += count;
            sum++;
            if(temp >= k) break;
        }
        return sum;
    }
}

💡 위의 지저분한 코드와 같은 로직이지만 더 깔끔해졌다!

➡️ 시간과 메모리는 확실히 줄었지만.. 여전히 비효율적이다. 다음엔 효율적으로 풀어보자!

728x90
반응형