https://school.programmers.co.kr/learn/courses/30/lessons/138476
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
## 문제 풀이법
주어진 배열 중 많이 존재하는 수의 갯수를 세야 하므로,
각 숫자의 갯수를 세기위해 가장 먼저 HashMap을 떠올렸다.
HashMap을 갯수가 많은 수대로 정렬해야 하는데 HashMap은 정렬이 불가능하므로,
List로 변환 후, 반복문을 돌면서
주어진 K에서 가장 많이 존재하는 수의 갯수를 빼면서 0이 되거나 음수가 나올 때 해당 값을 리턴한다.
로직을 간단하게 요약하자면 아래와 같다.
1. HashMap으로 주어진 배열의 수들의 갯수를 세어 저장한다.
2. 정렬을 위해 List로 변환
3. List의 반복문을 돌면서
3-1. value값을 꺼내 주어진 k에서 뺀다.
3-2. answer(종류의 수)를 +1
3-2. 뺄셈을 한 값이 양수면 계속 반복문 진행
3-3. 0이거나 음수이면 break 후 그 값을 리턴
## 코드
import java.util.*;
import java.util.stream.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
// HashMap으로 숫자의 개수를 저장한다
HashMap<Integer, Integer> map = new HashMap<>();
for(int num: tangerine){
if(!map.containsKey(num)){
map.put(num,1);
}else{
map.put(num, map.get(num) + 1);
}
}
// Stream을 사용하여 value 기준 내림차순 정렬
List<Map.Entry<Integer, Integer>> sortedEntries = map.entrySet()
.stream()
.sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
.collect(Collectors.toList());
// 값을 빼면서 k의 값이 음수가 될때 answer값을 리턴한다.
for(Map.Entry<Integer, Integer> entry: sortedEntries){
int num = entry.getValue();
k -= num;
answer++;
if(k<=0){
break;
}
}
return answer;
}
}
## 여담
1 ≤ tangerine의 원소 ≤ 10,000,000 와 같은 조건이 있어서 n2의 풀이로는 풀 수 없는 문제였다.
다른 사람들의 풀이와 비교했을 때 유사하게 푼 듯하다.
'코테' 카테고리의 다른 글
[프로그래머스/LV2] 호텔 대실 (1) | 2024.09.16 |
---|---|
[백준/브론즈1] 2775번: 부녀회장이 될테야 (0) | 2022.12.07 |
[백준/브론즈2] 2309번: 일곱 난쟁이 (0) | 2022.11.17 |
[프로그래머스/LV2] 주식가격(Stack) (0) | 2022.07.12 |
[프로그래머스/LV2] 타겟 넘버(DFS) (0) | 2022.07.11 |