본문 바로가기
프로그래밍 문제/프로그래머스

[프로그래머스] 베스트앨범(JAVA)

by 테크케찰 2020. 9. 10.

programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

import java.util.*;
import java.util.Map.Entry;

class Solution {
	
	class Song implements Comparable<Song>{
		int id, play;
		String genre;
		
		Song(int id, int play, String genre){
			this.id=id;
			this.play=play;
			this.genre=genre;
		}

		@Override
		public int compareTo(Song o) {
			// TODO Auto-generated method stub
			if(this.play==o.play) {
				return this.id-o.id;
			}
			else {
				return o.play-this.play;
			}
		}
		
		
	}
	
    public int[] solution(String[] genres, int[] plays) {
       ArrayList<Integer> result=new ArrayList<>();
       ArrayList<Song> songList=new ArrayList<>();
       HashMap<String, Integer> gMap=new HashMap<>();
       HashMap<String, Integer> pMap=new HashMap<>();
       
       for(int i=0;i<genres.length;i++) {
    	   songList.add(new Song(i, plays[i], genres[i]));
    	   
    	   if(gMap.containsKey(genres[i])) gMap.replace(genres[i], gMap.get(genres[i])+plays[i]);
    	   else	gMap.put(genres[i], plays[i]);
       }
       
       Collections.sort(songList, new Comparator<Song>() {

		@Override
		public int compare(Song o1, Song o2) {
			if(o1.genre.equals(o2.genre)) return o1.compareTo(o2); //A.compareTo(B): A가 B보다 작으면 음수, 크면 양수, 같으면 0
			else return gMap.get(o2.genre)-gMap.get(o1.genre);
		}
    	   
       });
       
       for(Song s:songList) {
    	   if(!pMap.containsKey(s.genre)) {
    		   pMap.put(s.genre, 1);
    		   result.add(s.id);
    	   }
    	   else {
    		   if(pMap.get(s.genre)>=2) continue;
    		   else {
    			   pMap.replace(s.genre, pMap.get(s.genre)+1);
    			   result.add(s.id);
    		   }
    	   }
       }
       
       int[] arr_result=new int[result.size()];
       for(int i=0;i<result.size();i++) {
    	   arr_result[i]=result.get(i);
       }
       return arr_result;
    }
}

이번 문제를 풀면서 아래 링크를 참고하면서 풀었습니다.

velog.io/@hyeon930/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B2%A0%EC%8A%A4%ED%8A%B8%EC%95%A8%EB%B2%94-Java

 

[프로그래머스] 베스트앨범 (Java)

프로그래머스 베스트앨범베스트엘범의 수록 기준을 바탕으로 모든 노래를 정렬하면되는 문제다. 자료구조를 이용하는 것이 핵심이다.노래의 id, play, genre 를 담고있는 Song 객체를 만들어서 ArrayL

velog.io

먼저 id, genre, play 변수가 담겨 있는 Song 객체를 선언하고, Song 객체를 담을 ArrayList인 songList와 genre와 play를 각각 저장해줄 HashMap gMap, pMap을 선언해주었습니다. 

gMap에는 장르별 플레이수를 저장해주었고, Collections.sort()를 이용해 songList를 장르별 플레이수에 따라 내림차순으로 정렬해주었습니다.

이후 for each문을 이용해 pMap이 key를 가지고 있지 않으면 pMap에 카로 genre를,  값으로 1을 지정해주고, ArrayList result에 Song의 id를 저장해줍니다.

만약 pMap에 이미 저장이 되어있어 key를 포함하고 있는 Song 객체라면, pMap의 값이 2 이상이면 넘어가고 그렇지 않으면 result 리스트에 Song 객체의 id 값을 저장해줍니다.

이렇게 하는 이유는 각 장르별로 플레이 수가 가장 많은 곡을 두 개까지 추가하려 하기 때문입니다.