ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณ ๋“์  kit ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/Programmers 2020. 7. 14. 16:13

    ๐Ÿ“š ๋ฌธ์ œ ์„ค๋ช…

    ์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ์ดํŠธ์—์„œ ์žฅ๋ฅด ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋‘ ๊ฐœ์”ฉ ๋ชจ์•„ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ์ถœ์‹œํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ž˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๋…ธ๋ž˜๋ฅผ ์ˆ˜๋กํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

    1. ์†ํ•œ ๋…ธ๋ž˜๊ฐ€ ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

    2. ์žฅ๋ฅด ๋‚ด์—์„œ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

    3. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋…ธ๋ž˜ ์ค‘์—์„œ๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

     

    ๋…ธ๋ž˜์˜ ์žฅ๋ฅด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด genres์™€ ๋…ธ๋ž˜๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด plays๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์— ๋“ค์–ด๊ฐˆ ๋…ธ๋ž˜์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.

     

    ์ œํ•œ์‚ฌํ•ญ

    • genres[i]๋Š” ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋ž˜์˜ ์žฅ๋ฅด์ž…๋‹ˆ๋‹ค.

    • plays[i]๋Š” ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋ž˜๊ฐ€ ์žฌ์ƒ๋œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

    • genres์™€ plays์˜ ๊ธธ์ด๋Š” ๊ฐ™์œผ๋ฉฐ, ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.

    • ์žฅ๋ฅด ์ข…๋ฅ˜๋Š” 100๊ฐœ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.

    • ์žฅ๋ฅด์— ์†ํ•œ ๊ณก์ด ํ•˜๋‚˜๋ผ๋ฉด, ํ•˜๋‚˜์˜ ๊ณก๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ์žฅ๋ฅด๋Š” ์žฌ์ƒ๋œ ํšŸ์ˆ˜๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

     

    ๐ŸŽฏ ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋‚˜

    import java.util.HashMap;
    import java.util.ArrayList;
    import java.util.Comparator;
    
    class Song {
        int id;
        int play;
        int genreTotalPlay;
        
        public Song(int id, int play, int genreTotalPlay){
            this.id = id;
            this.play = play;
            this.genreTotalPlay = genreTotalPlay;
        }
        
        public int getId() {
            return this.id;
        }
        
        public int getPlay() {
            return this.play;
        }
        
        public int getGenreTotalPlay() {
            return this.genreTotalPlay;
        }
    }
    
    class Solution {
        public int[] solution(String[] genres, int[] plays) {
            int n = genres.length;
            int[] bestAlbum;
            
            HashMap<String, Integer> genreNtotalPlays = new HashMap<String, Integer>();
            ArrayList<Song> songList = new ArrayList<Song>();
            ArrayList<Integer> bestSongs = new ArrayList<Integer>();
            
            // Phase 1 : Set priority of genre using total play
            for(int i = 0; i < n; i++) {
                String genre = genres[i];
                int play = plays[i];
                
                if(genreNtotalPlays.containsKey(genre)) {
                    int totalPlay = genreNtotalPlays.get(genre) + play;
                    genreNtotalPlays.replace(genre, totalPlay);
                }
                else {
                    genreNtotalPlays.put(genre, play);
                }
            }
            
            // Phase 2 : init songList
            for(int i = 0; i < n; i++) {
                int id = i;
                int play = plays[i]; 
                int genreTotalPlay = genreNtotalPlays.get(genres[i]);
                
                songList.add(new Song(id, play, genreTotalPlay));
            }
            
            // Phase 3 : sort with multiple condition
            songList.sort(Comparator.comparing(Song::getGenreTotalPlay)
                                    .thenComparing(Song::getPlay).reversed()
                                    .thenComparing(Song::getId));
            
            
            // Phase 4 : add song to best album
            int prevGenre = songList.get(0).genreTotalPlay;
            int numGenre = -1;
            for(Song s : songList) {
                int currGenre = s.genreTotalPlay;
                
                if(prevGenre == currGenre){
                    numGenre++;
                    
                    if(numGenre < 2) {
                        bestSongs.add(s.id);
                    }
                }
                else {
                    prevGenre = currGenre;
                    numGenre = 0;
                    
                    bestSongs.add(s.id);
                }
            }
            
            bestAlbum = bestSongs.stream().mapToInt(Integer::intValue).toArray();
            
            return bestAlbum;
        }
    }

     

    ๐Ÿง ์™œ ์ €๋ ‡๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ '์žฅ๋ฅด๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ์žฅ๋ฅด์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„์˜ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ'์ด๋‹ค.

    ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์ค‘ ์กฐ๊ฑด์— ๋Œ€ํ•ด ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    1. ์†ํ•œ ๋…ธ๋ž˜๊ฐ€ ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

    2. ์žฅ๋ฅด ๋‚ด์—์„œ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

    3. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋…ธ๋ž˜ ์ค‘์—์„œ๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

     

    ์ฒ˜์Œ ์กฐ๊ฑด์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์žฅ๋ฅด๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

    ์ด๋•Œ ์ œํ•œ์‚ฌํ•ญ์—์„œ '๋ชจ๋“  ์žฅ๋ฅด๋Š” ์žฌ์ƒ๋œ ํšŸ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค'๊ณ  ํ•˜๋‹ˆ ์žฅ๋ฅด๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ์žฅ๋ฅด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•„๋„ ๋ฌธ์ œ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    ๊ทธ๋ž˜์„œ ํ•ด์‹œ๋งต์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ์žฅ๋ฅด๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ํŒŒ์•…ํ–ˆ๋‹ค.

    ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์‰ฝ๋‹ค. ๋…ธ๋ž˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ๋‹ค์ค‘ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •๋ ฌํ•œ๋‹ค.

    ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ๊ฒƒ๋“ค์„ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์— ๋„ฃ๋Š”๋‹ค.

     

    ๐Ÿ“– ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜

    ๋ฌธ์ œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€, ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์žˆ๋Š”์ง€๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์‹ค๋ ฅ์ด ์„ฑ์žฅํ•ด์„œ ๋ฟŒ๋“ฏํ•˜๋‹ค. ๐Ÿ˜„

    ๋Œ“๊ธ€

Designed by Tistory.