본문 바로가기

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;
}
}