728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/138476
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드(Java)
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
// 1. 각 크기별로 몇 개씩 있는지 세어서 Map에 저장
Map<Integer, Integer> countMap = new HashMap<>();
for (int size : tangerine) {
countMap.put(size, countMap.getOrDefault(size, 0) + 1);
}
// 2. Map에 저장된 '개수(Value)'만 모두 뽑아서 리스트로 만듦
List<Integer> counts = new ArrayList<>(countMap.values());
// 3. 귤이 많은 묶음부터 보기 위해 내림차순 정렬 (큰 수 -> 작은 수)
counts.sort(Collections.reverseOrder());
int answer = 0;
// 4. 개수가 많은 묶음부터 상자에 넣기 시작
for (int count : counts) {
// 이미 k개를 다 채웠으면 종료
if (k <= 0) break;
// 이번 크기의 귤을 모두 상자에 넣음;
k -= count;
// 서로 다른 크기 종류를 하나 사용했으므로 +1
answer++;
}
return answer;
}
}
- `Map<Integer, Integer> countMap = new HashMap<>();`
→ (키=귤크기, 값=개수)를 저장할 빈 맵을 만듦 - `for (int size : tangerine) { ... }`
→ 귤 배열 `[1, 3, 2, 5, 4, 5, 2, 3]`을 하나씩 꺼냄
- `countMap.getOrDefault(size,0) + 1`
: 만약 맵에 해당 크기가 없으면 0을, 있으면 기존 개수를 꺼내서 +1 - `countMap.put(...)`으로 다시 저장
- `countMap.getOrDefault(size,0) + 1`
코드(Python)
from collections import Counter
def solution(k, tangerine):
# 1. 각 크기별 개수를 세고, 개수(Value)만 뽑아서 리스트로 만듦
counts = list(Counter(tangerine).values())
# 2. 개수가 많은 순서대로 정렬 (내림차순)
counts.sort(reverse=True)
answer = 0
# 3. 개수가 많은 묶음부터 상자에 넣기 시작
for count in counts:
if k <= 0: # 다 채웠으면 종료
break
k -= count # 해당 크기 귤을 전부 넣음
answer += 1 # 종류 개수 증가
return answer
- `counts = list(Counter(tangerine).values())`
- `Counter(tangerine)` → 귤 배열을 보며 {1: 1, 2: 2, 3: 2, 4: 1, 5: 2} 라는 Dictionary를 만듦 (1이 1개, 2가 2개, 3이 2개, 4가 1개, 5가 2개)
- `.values()` → Dictionary에서 '개수' 부분만 꺼냄 → `[1, 2, 2, 1, 2]`
- `list(...)` → 리스트로 감싸서 → `counts = [2, 2, 2, 1, 1]`