본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 귤 고르기

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

크기의 종류가 최소인 경우를 구하는 문제

for (int i : tangerine) {
    map.put(i, map.getOrDefault(i, 0) + 1);
}
for (int i : map.keySet()) {
    al.add(map.get(i));
}
al.sort(Collections.reverseOrder())

HashMap을 이용하여 종류별 개수를 구해주었다

그리고  ArrayList에 해당 값들을 넣어주고 내림차순으로 정렬을 해주었다

int cnt = 0;
while (k > 0) {
    if (al.isEmpty()) break;
    if (al.get(0) > k) {
        al.remove(0);
        cnt++;
        break;
    } else {
        k -= al.get(0);
        al.remove(0);
        cnt++;
    }
}

이후 ArrayList의 맨 앞부분을 가지고, 그 값이 K보다 작거나 같으면 K에 그 값을 빼주어 남은 개수를 갱신하고 서로 다른 종류의 횟수(cnt)를 증가시켰다

그러다가 값이 K보다 큰 순간 break를 하고 cnt를 정답으로 출력하였다

import java.util.*;
class Solution {
    public int solution(int k, int[] tangerine) {
        ArrayList<Integer> al = new ArrayList<>();
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i : tangerine) {
            map.put(i, map.getOrDefault(i, 0) + 1);
        }
        for (int i : map.keySet()) {
            al.add(map.get(i));
        }
        al.sort(Collections.reverseOrder());
        int cnt = 0;
        while (k > 0) {
            if (al.isEmpty()) break;
            if (al.get(0) > k) {
                al.remove(0);
                cnt++;
                break;
            } else {
                k -= al.get(0);
                al.remove(0);
                cnt++;
            }
        }
        return cnt;
    }
}