기몽수
코딩 기록일지
기몽수
전체 방문자
오늘
어제
  • 분류 전체보기 (443)
    • 알고리즘 - SWEA (210)
      • D1 (19)
      • D2 (25)
      • D3 (143)
      • D4 (21)
      • D5 (2)
    • 알고리즘 - Programmers (74)
      • Unrated (34)
      • Lv 0 (4)
      • Lv 1 (3)
      • Lv 2 (32)
      • Lv 3 (1)
    • 알고리즘 - Baekjoon (158)
      • Bronze (1)
      • Silver (65)
      • Gold (90)
      • Platinum (2)
    • 취업 (0)
    • SSAFY (1)
hELLO · Designed By 김용수.
기몽수

코딩 기록일지

알고리즘 - Programmers/Lv 2

[level 2] 귤 고르기

2023. 10. 11. 15:47

문제 링크

성능 요약

메모리: 106 MB, 시간: 64.52 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2023년 10월 3일 15:45:36

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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

입출력 예 설명

입출력 예 #1

  • 본문에서 설명한 예시입니다.

입출력 예 #2

  • 경화는 크기가 2인 귤 2개와 3인 귤 2개 또는 2인 귤 2개와 5인 귤 2개 또는 3인 귤 2개와 5인 귤 2개로 귤을 판매할 수 있습니다. 이때의 크기 종류는 2가지로 이 값이 최소가 됩니다.

입출력 예 #3

  • 경화는 크기가 1인 귤 2개를 판매하거나 2인 귤 2개를 판매할 수 있습니다. 이때의 크기 종류는 1가지로, 이 값이 최소가 됩니다.

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

 

import java.util.*;

class Solution {
    public int solution(int k, int[] tangerine) {
        Map<Integer, Integer> sizePerCount = new HashMap<>();
        for(int t : tangerine){
            sizePerCount.put(t, sizePerCount.getOrDefault(t,0)+1);
        }
        
        List<Integer> sizeCount = new ArrayList<>(sizePerCount.values());
        Collections.sort(sizeCount, (o1,o2) -> o2 - o1 );
        
        int n = 0;
        int sumCount = 0;
        for(int count : sizeCount){
            sumCount += count;
            n++;
            
            if(k <= sumCount)
                break;
        }
        
        return n;
    }
}

'알고리즘 - Programmers > Lv 2' 카테고리의 다른 글

[level 2] 괄호 회전하기  (0) 2023.10.12
[level 2] k진수에서 소수 개수 구하기  (0) 2023.10.11
[level 2] 멀리 뛰기  (1) 2023.10.10
[level 2] N개의 최소공배수  (0) 2023.10.10
[level 2] 예상 대진표  (1) 2023.10.10
    '알고리즘 - Programmers/Lv 2' 카테고리의 다른 글
    • [level 2] 괄호 회전하기
    • [level 2] k진수에서 소수 개수 구하기
    • [level 2] 멀리 뛰기
    • [level 2] N개의 최소공배수
    기몽수
    기몽수

    티스토리툴바