귤 먹고 싶다
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
int count = 0;
HashMap <Integer, Integer>map = new HashMap<>();
for(int i = 0; i < tangerine.length; i++){
if(map.get(tangerine[i]) == null){
map.put(tangerine[i], 1);
}else{
int temp = (int)map.get(tangerine[i]);
map.put(tangerine[i], temp+1);
}
}
//value 기준으로 내림차순 정렬
List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
for (Integer key : keySet) {
int keyVal = map.get(key);
count = count + keyVal;
answer++;
if(count > k){
//정답보다 k가 작으면 다시 빼줌
count = count - keyVal;
answer--;
//System.out.println("다시 빼줌 " + count);
}else if(count == k){
//종료
//System.out.println("끝! 정답값 " + count);
break;
}else{
//정답보다 k가 크면 계속 더함
//System.out.println("정답값 " + count);
}
}
return answer;
}
}
이렇게 호로록 짰는데 시간 초과 떠서 고민!!
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
int count = k;
HashMap <Integer, Integer>map = new HashMap<>();
for(int i = 0; i < tangerine.length; i++){
if(map.get(tangerine[i]) == null){
map.put(tangerine[i], 1);
}else{
int temp = (int)map.get(tangerine[i]);
map.put(tangerine[i], temp+1);
}
}
// 개수(value)가 많은 순으로 정렬
List<Map.Entry<Integer, Integer>> keySet = new ArrayList<>(map.entrySet());
keySet.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
// 개수가 많은 순부터 사용
for (Map.Entry<Integer, Integer> entry : keySet) {
if(count<=0){
break;
}else{
answer++;
count -= entry.getValue();
}
}
return answer;
}
}
다른 분 푼 거 보니까 map.entry 썼길래 이걸로 바꿔서 통과...
취
저것은 Java8에서 나온 Map.Entry 객체 컬렉션인데
저렇게 루프 돌리는게 효율적인가 보다!
용도는 Map을 For문에서 돌려줄 때 쓰는 거시다!
sort 람다 식으로 나와있어서 편하다 싶었는데 루프도 있었구만!
댓글
댓글 쓰기