08
27

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Integer> arr = new ArrayList();
        HashMap<String, PriorityQueue<Song>> s = new HashMap();
        HashMap<String, Integer> g = new HashMap();
        for(int i = 0; i < genres.length; i++){
            g.put(genres[i], g.getOrDefault(genres[i], 0)+plays[i]); // ์–˜๋Š” ์žฅ๋ฅด๋ณ„ ์ด ์žฌ์ƒ ์ˆ˜ ๋„ฃ๊ฒŒ
            s.putIfAbsent(genres[i], new PriorityQueue<Song>((o1,o2)->{
                if(o2.plays == o1.plays){
                    // ์žฌ์ƒ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด id๊ฐ€ ๋‚ฎ์€๊ฑธ๋กœ ์ •๋ ฌ
                    return o1.id - o2.id;
                }
                return o2.plays-o1.plays;
            }));
            s.get(genres[i]).add(new Song(i, plays[i]));
        } // ์ž…๋ ฅ์„ ๋ฐ›์•˜๋‹ค. ๊ฐ ์žฅ๋ฅด ๋ณ„๋กœ plays ์ˆœ ๋‚ด๋ฆผ์ •๋ ฌ, plays๊ฐ€ ๊ฐ™์œผ๋ฉด id ์˜ค๋ฆ„์ •๋ ฌ.
        // ๊ฐ ์žฅ๋ฅด ๋ณ„๋กœ 2๊ฐœ์”ฉ ๋ฝ‘์œผ๋ฉด ๋˜๋Š”๋ฐ, 1๊ฐœ๋งŒ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑฐ๋งŒ ์„ ํƒํ•œ๋‹ค
        // ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•œ๋‹ค -> ์ด๊ฒŒ ์ข€ ์• ๋งค
        
        // ํ‚ค-๊ฐ’ ์Œ์„ List๋กœ ๋ณ€ํ™˜
        List<Map.Entry<String, Integer>> list = new ArrayList(g.entrySet());
        // value๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
        Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        
        for(Map.Entry<String, Integer> entry: list){
            // ์žฌ์ƒ ์ˆ˜๋กœ ์ •๋ ฌ๋œ ํ‚ค๋ฅผ ๊ฐ–๋‹ค๊ฐ€
            String genre = entry.getKey();
            int cnt = 0;
            while(cnt < 2){
                if(!s.get(genre).isEmpty()){
                    // ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด
                    arr.add(s.get(genre).poll().id);
                    cnt++;
                }else{
                    // ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ
                    break;
                }
            }
        }
        int[] answer = new int[arr.size()];
        int idx = 0;
        for(int id: arr){
            answer[idx++] = id;
        }
        
        return answer;
    }
}

class Song{
    int id; 
    int plays;
    Song(int id, int plays){
        this.id = id;
        this.plays = plays;
    }
}

IDE์•ˆ์“ฐ๊ณ  ๊ทธ๋ƒฅ ๋ฐ”๋กœ ํ’€์—ˆ๋‹ค. Map ์กฐ์ž‘์— ์กฐ๊ธˆ ์ต์ˆ™ํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

์กฐ๊ฑด์ด ์ข€ ๋งŽ์•„์„œ ๊นŒ๋‹ค๋กœ์› ๋˜ ๋ฌธ์ œ๋‹ค. 

  1. ์ด ์žฌ์ƒ ์ˆ˜๊ฐ€ ๋งŽ์€ ์žฅ๋ฅด ์ˆœ์„œ๋Œ€๋กœ
  2. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์„œ๋Œ€๋กœ
  3. ์žฌ์ƒ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด id๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ 
  4. 2๊ฐœ๊นŒ์ง€ ๋ฝ‘์•„์„œ id๋ฅผ ๊ธฐ๋กํ•ด๋ผ

์ž‘๊ฒŒ ๋ถ€๋ถ„์„ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ ์กฐ๊ธˆ ๋” ํŽธํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

HashMap์˜ value๋กœ Collection์„ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ๊นŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. 


# ์ถ”๊ฐ€ ๊ณต๋ถ€

์ด๋ฒˆ ๋ฌธ์ œ ํ’€๋ฉด์„œ ๊ฒ€์ƒ‰ํ—€๋˜ ๊ฑด HashMap์—์„œ key ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

List<Map.Entry<String, Integer>> list = new ArrayList(g.entrySet());
Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));

entrySet์„ ArrayList์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ฒ˜์Œ์•Œ์•˜๋‹ค.

entrysetํƒ€์ž…์€ Map.Entryํ˜•ํƒœ๋‹ˆ๊นŒ ์ฃผ์˜ํ•ด์•ผ๋˜๊ณ , compareTo๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์ด ๋œ list๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));

์ด๋Ÿฌ๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋‹ค.

compareTo์˜ ์•ž์— ์žˆ๋Š”๊ฑธ ๊ธฐ์ค€์œผ๋กœ compareTo์•ˆ์˜ ๊ฐ’์ด ํฌ๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ, ์ž‘์œผ๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค. Comparator๋ฅผ ๋žŒ๋‹ค๋กœ ์ž‘์„ฑํ•œ ํ˜•ํƒœ๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT