관리 메뉴

기록하는 공간

(프로그래머스) 귤 고르기 - P138476 본문

알고리즘 문제풀이/프로그래머스

(프로그래머스) 귤 고르기 - P138476

giwoong01 2023. 6. 28. 19:57

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3]이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해 주세요.

제한사항

  • 1 ≤ k ≤ tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

입출력 예

 

k tangerine result
6 [1, 3, 2, 5, 4, 5, 2, 3] 3
4 [1, 3, 2, 5, 4, 5, 2, 3] 2
2 [1, 1, 1, 1, 2, 2, 2, 3] 1

 


코드 설명

귤 크기만큼 정렬하기 위해서 HashMap을 사용하였다. key와 value모두 Integer타입으로 지정해 주었다.

if (hm.get(i) == null) {
    hm.put(i, 1);
} else {
    hm.put(i, hm.get(i) + 1);
}

기존에는 이 if문을 사용하여 tangerine에 있는 값들을 정리하려 했다.

 

이 코드는 hashmap에 해당하는 키의 value값이 비어있다면 put을 해주고,

해당하는 값이 있다면 해당하는 key의 value값만 + 1을 해주기로 했다.

 

하지만 이보다 더 간결하고 보기 좋은 코드가 있었다.

hm.merge(i, 1, Integer::sum);

hashmap의 내장함수인데 그것은 merge이다.

() 안에 순서대로 (key, value, ((v1, v2) → v1 + v2))이다.

 

예를 들어 기존에 (key, value)가 (1, 2)였다고 가정하자.

그 후 다음 값의 key 값이 1이라면 hm.merge(1, 1, Integer::sum)으로 들어가기 때문에 value는 3이 된다.

즉 다음 값의 (key, value) 값은 (1, 3)이다.

 

List<Integer> valueList = new ArrayList<>(hm.keySet());
valueList.sort((o1, o2) -> hm.get(o2).compareTo(hm.get(o1)));

그 후 키 값을 list에 넣고 value를 기준으로 내림차순으로 정렬을 하였다.

 

for (int i : valueList) {
    k -= hm.get(i);
    answer++;

    if (k <= 0) break;
}

마지막으로 for문을 이용하여 list의 값을 순서대로 반복하였다.

hashmap에 list에서 나온 key에 해당하는 value값을 k에 빼주고 answer을 증가시킨다.

list의 크기만큼 반복하면서 만약 k가 0보다 작거나 같다면 반복문을 빠져나와 준다.

 


코드

import java.util.*;

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

        HashMap<Integer, Integer> hm = new HashMap<>();

        for (int i : tangerine) {
            hm.merge(i, 1, Integer::sum);
//            if (hm.get(i) == null) {
//                hm.put(i, 1);
//            } else {
//                hm.put(i, hm.get(i) + 1);
//            }
        }

        List<Integer> valueList = new ArrayList<>(hm.keySet());
        valueList.sort((o1, o2) -> hm.get(o2).compareTo(hm.get(o1)));

        for (int i : valueList) {
            k -= hm.get(i);
            answer++;

            if (k <= 0) break;
        }

        return answer;
    }
}

 

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges