Algorithm/Programmers Java

[JAVA] 프로그래머스 level2 귤 고르기

제우제우 2024. 7. 13. 22:13

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > 연습문제 > 귤 고르기 

 

문제 접근

map, stream, iterator를 활용해서 문제를 해결했다.

자바의 Map.Entry, Iterator, Stream을 활용할 줄 알면 아주 간단한 문제였다. 

코테에서 자주 나오는 친구들이니 몰랐다면 이번 기회에 익혀두는 걸 추천한다. 

 

다시 생각해 보니까 굳이 stream을 사용하지 않고 map.values()를 사용해서 리스트로 뽑는 방식으로 value 를 활용하는 방식으로 했으면 더 간단했겠네요 ㅠ 이런 풀이도 있구나 참고하는 용도면 좋을듯합니당

 

 

map 생성

key: 귤 종류 value: 귤 개수 

HashMap<Integer, Integer> map = new HashMap<>();

 

귤 count & map에 기록

for(int i = 0; i < tangerine.length; i++){
    map.put(tangerine[i], map.getOrDefault(tangerine[i], 0) + 1);
}

 

map 정렬 귤의 개수가 많은 순서대로 정렬 즉 value를 기준으로 내림차순 정렬

 

map.entrySet(): map 에서 Map.Entry<Integer, Integer> 변환 

stream(): Map.Entry<Integer, Integer> stream 데이터로 변환 

sorted(): value를 기준으로 내림차순  

collect(Collectors.toList()): 정렬해서 나온 결과를 List<Map.Entry<Integer, Integer>>로 변환 

iterator(): 해당 리스트를 이터레이터로 변환 

 Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().stream().sorted((o1,o2)->{
    return o2.getValue() - o1.getValue();
}).collect(Collectors.toList()).iterator();

 

핵심 로직 시작 

 

우린 최소한의 귤 종류를 가지고 싶다. 

그럼 귤 개수가 가장 많은 귤 종류부터 선택해 나가면 된다. 

int answer = 0; // 선택한 귤 종류 count
int cnt    = 0; // 선택한 귤 누적 count 
while(cnt < k && it.hasNext()){
    Map.Entry<Integer, Integer> entry = it.next();
    answer++; // 귤 종류 up 
    cnt += entry.getValue();
}

 

전체 코드

import java.util.*;
import java.util.stream.*;
class Solution {
    public int solution(int k, int[] tangerine) {
        
        HashMap<Integer, Integer> map = new HashMap<>();
        
        for(int i = 0; i < tangerine.length; i++){
            map.put(tangerine[i], map.getOrDefault(tangerine[i], 0) + 1);
        }
        
        // 귤의 개수가 많은 순서대로 map 정렬
        // map -> Map.Entry<Integer, Integer> -> stream -> 정렬 -> 
        // List<Map.Entry<Integer, Integer> -> iterator 
        Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().stream().sorted((o1,o2)->{
            return o2.getValue() - o1.getValue();
        }).collect(Collectors.toList()).iterator();
        
        int answer = 0; // 선택한 귤 종류 count
        int cnt    = 0; // 선택한 귤 누적 count 
        while(cnt < k && it.hasNext()){
            Map.Entry<Integer, Integer> entry = it.next();
            answer++; // 귤 종류 up 
            cnt += entry.getValue();
        }
        
        return answer++;
    }
}
  1. 귤 고르기
  •  
  1. 귤 고르기
  •