본문 바로가기
  • "하나씩 기록하다보면 누군가에게 도움이 되지 않을까"
IT/알고리즘 풀이

[프로그래머스] [자바] 해시/베스트앨범

by raVineL 2022. 1. 26.
728x90

문제 출처

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

 

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

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

programmers.co.kr


1. 풀이 접근

  ㆍ 해시사용해서 재생횟수 확인

  Comparator<> 사용하여 클래스의 순서를 정렬함

 


2. 소스코드

import java.util.*;

class Music{
    String g;
    int p;
    int o;
}
class prior{
    String n;
    int p;
}
class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        
        HashMap<String, Integer> list = new HashMap<>();
        HashMap<String, Integer> genreMap =  new HashMap<>();
        ArrayList<String> uniqGenre = new ArrayList<>();
        ArrayList<Music> music = new ArrayList<>();
        for(int i = 0 ; i < genres.length ; i++){
            
            // Music m = new Music();
            // m.g = genres[i];
            // m.p = plays[i];
            // m.o = i;
            // music.add(m);
            
            Integer a = list.getOrDefault(genres[i], 0);
            list.put(genres[i], a + plays[i]);
            
            
            Integer b = genreMap.getOrDefault(genres[i], 0);
            if(b == 0){
               genreMap.put(genres[i], 1);
               uniqGenre.add(genres[i]);
            }else{
               genreMap.put(genres[i], b+1);
            }
            
        }
            ArrayList<prior> Prior = new ArrayList<prior>();
//         for(int i = 0 ; i < genres.length ; i++){
//             Integer a = list.getOrDefault(genres[i], 0);
//             //System.out.println(genres[i] + " " + a);
            
//         }
          for(int i = 0 ; i < uniqGenre.size() ; i++){
            
           // System.out.println(uniqGenre.get(i));
            prior p = new prior();
              p.n = uniqGenre.get(i);
               Integer a = list.getOrDefault(p.n, 0);
              p.p = list.getOrDefault(p.n, 0);
              Prior.add(p);
              
        }
        
                Comparator<prior> myComparator2 = new Comparator<prior>() {
  @Override
  public int compare(prior p1, prior p2) { 
   if (p1.p > p2.p) {
      return -1; 
    }
    else if (p1.p == p2.p) {
   
        return 1;
   
    }
    return 1;

  
  }
};
        
        Collections.sort(Prior, myComparator2);
          for(int i = 0 ; i < Prior.size() ; i++){
           // System.out.println(Prior.get(i).n + " " + Prior.get(i).p);
        }
        int cnt = 0;
        for(int i = 0 ; i < Prior.size() ; i++){
               String p = Prior.get(i).n;
          Integer cn = genreMap.getOrDefault(p, 0);
            if(cn >= 2)
            cnt += 2;
            else
                cnt +=1;
        }
        int[] playlist = new int[cnt]; 
        int playlistIdx = 0;
        for(int i = 0 ; i < Prior.size() ; i++){
            String p = Prior.get(i).n;
           Integer cn = genreMap.getOrDefault(p, 0);
            int tem = 0;
              if(cn >= 2)
            tem = 2;
            else
                tem = 1;
            for(int k = 0 ; k <tem  ; k++){
                  int maxPlay  = -1;
                    int minOrder= Integer.MAX_VALUE;
            for(int j = 0 ; j < plays.length ; j++){
                String cp = genres[j];
                int corder = j;
                int cpl = plays[j];
                if(cpl > maxPlay && cp.equals(p))
                {
                    minOrder = corder;
                    maxPlay = cpl;
                }else if(cpl == maxPlay){
                    if(corder < minOrder){
                        minOrder = corder;
                        maxPlay= cpl;
                    }
                }
                
                
            }
              //  System.out.println(playlistIdx + " " +minOrder);
                playlist[playlistIdx] = minOrder;
                playlistIdx++;
                genres[minOrder] = " ";
                plays[minOrder] = 0;
                maxPlay = -1;
                minOrder= Integer.MAX_VALUE;
            }
        }
        
        return playlist;
    }
}

3. 맺음말

  ㆍ 체감난이도 : 보통

  접근 방법에 대해 특별한 알고리즘이 필요하지 않아 어렵지 않지만, 문제의 순서와 로봇의 로직을 정확하게 판단하고 그것을 구현하여야 함.

  더욱 좋은 풀이방법이나 보완할 수 있는 부분, 또는 문제가 될 수 있는 부분들은 알려주시면 감사하겠습니다.

728x90

댓글