베스트앨범 - 프로그래머스 해시 Lv3 Java

P.S./프로그래머스 2023. 1. 18. 14:54
728x90
728x90

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

 

풀이


1. getOrDefault

Map의 getOrDefault 를 사용하여 문제의 최우선 조건인 속한 노래가 많이 재생된 장르가 우선시되는 것을 만족시켰다.

getOrDefault(Object key, V DefaultValue)
찾는 key가 존재하면 해당 key에 매핑되어있는 값을 반환하고,
그렇지 않으면 디폴트 값이 반환된다.

map.getOrDefault(genres[i], 0)+plays[i])

Map의 Key값이 중복이 되지 않는 특성을 이용해, 같은 장르일 때 재생된 시간을 더해주었다.

 

 

2. compareTo

compareTo를 이용하여 map의 value별 내림차순 정렬을 통한 key값만 따로 컬렉션에 저장했다.

컬렉션에 저장된 Key의 값은 출력 될 장르의 순서가 될 것이다.

Collections.sort(mapKey, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));

 

3. 기타사항

이미 장르 순서는 정해져 있으니, 조건을 통해 장르별로 두 개씩 높은 순으로 뽑아낸 다음, 많이 재생된 노래의 index순서만 담아낸다면 문제는 해결된다.

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int length = plays.length;
        //1. 속한 노래가 많이 재생된 장르 먼저 수록 -> map에 장르Key, 재생횟수Value
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(int i=0; i<length; i++) {
        	map.put(genres[i], map.getOrDefault(genres[i], 0)+plays[i]);
        }
        
        //mapKey는 map의 value 내림차순의 Key순서
		ArrayList<String> mapKey = new ArrayList<>(map.keySet());
        Collections.sort(mapKey, (o1, o2) ->
        (map.get(o2).compareTo(map.get(o1))));
        ArrayList<Integer> playsList = new ArrayList<Integer>();
        
        //mapKey의 key값 만큼만 돌리면 해당key일 때의 최고순위 알수있음
        for(int i=0; i<mapKey.size(); i++) {
        	String type = mapKey.get(i);
        	//해당 장르중 가장 큰 값 찾기, 변수들의 각 장르마다 초기화가 필요하다.
        	int max = 0;
        	int idx = -1;
        	for(int j=0; j<length; j++) {
        		if(type.equals(genres[j]) && (max < plays[j])) {
        			max = plays[j];
        			idx = j;
        		}
        	}
        	//두번째 찾기
        	int secidx = -1; max = 0;
        	for(int j=0; j<length; j++) {
        		if(type.equals(genres[j]) && (max < plays[j]) && (j != idx)) {
        			max = plays[j];
        			secidx = j;
        		}
        	}
        	//인덱스 값 넣기. 두번째 인덱스는 없을 수도 있음. -1이 들어가면 안됨
        	playsList.add(idx);
        	if(secidx>=0) playsList.add(secidx);
        }
        
        int ansSize = playsList.size();
        int[] answer = new int[ansSize];
        for(int i=0; i<ansSize; i++) {
        	answer[i] = playsList.get(i);
        }
        
        return answer;
    }
}

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록