-
[Algo Rhythm๐บ๐] ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ kit ๋ฒ ์คํธ ์จ๋ฒAlgo Rhythm๐บ๐/Programmers 2020. 7. 14. 16:13
๐ ๋ฌธ์ ์ค๋ช
์คํธ๋ฆฌ๋ฐ ์ฌ์ดํธ์์ ์ฅ๋ฅด ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋ ๊ฐ์ฉ ๋ชจ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ถ์ํ๋ ค ํฉ๋๋ค. ๋ ธ๋๋ ๊ณ ์ ๋ฒํธ๋ก ๊ตฌ๋ถํ๋ฉฐ, ๋ ธ๋๋ฅผ ์๋กํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
-
์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
-
์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
๋ ธ๋์ ์ฅ๋ฅด๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด 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; } }
๐ง ์ ์ ๋ ๊ฒ ํ์๋
์ด ๋ฌธ์ ์ ํต์ฌ์ '์ฅ๋ฅด๋ณ ์ฌ์ ํ์๋ฅผ ์ฅ๋ฅด์ ๋ํ ์ฐ์ ์์์ ๊ธฐ์ค์ผ๋ก ์ผ๋ ๊ฒ'์ด๋ค.
๋ฌธ์ ๋ฅผ ์ฝ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ค์ค ์กฐ๊ฑด์ ๋ํด ์ ๋ ฌํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
-
์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
-
์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
-
์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
์ฒ์ ์กฐ๊ฑด์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด์๋ ์ฅ๋ฅด๋ณ ์ฌ์ ํ์๋ฅผ ์์์ผ ํ๋ค.
์ด๋ ์ ํ์ฌํญ์์ '๋ชจ๋ ์ฅ๋ฅด๋ ์ฌ์๋ ํ์๊ฐ ๋ค๋ฅด๋ค'๊ณ ํ๋ ์ฅ๋ฅด๋ณ ์ฌ์ ํ์๋ฅผ ์ฅ๋ฅด๋ฅผ ๋ํํ๋ ์ฐ์ ์์ ๊ธฐ์ค์ผ๋ก ์ผ์๋ ๋ฌธ์ ์์์ ์ ์ ์๋ค.
๊ทธ๋์ ํด์๋งต์ ์ฌ์ฉํด์ ๊ฐ ์ฅ๋ฅด๋ณ ์ฌ์ ํ์๋ฅผ ํ์ ํ๋ค.
๋ค์๋ถํฐ๋ ์ฝ๋ค. ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ ํ ๋ค์ค ์กฐ๊ฑด์ ๋ง๊ฒ ์ ๋ ฌํ๋ค.
๋ง์ง๋ง์ผ๋ก ๊ทธ๊ฒ๋ค์ ๋ฒ ์คํธ ์จ๋ฒ์ ๋ฃ๋๋ค.
๐ ๋ฌด์์ ๋ฐฐ์ ๋
๋ฌธ์ ๋ฅผ ์ฝ์ผ๋ฉด์ ๋ฌด์์ด ํ์ํ์ง, ๊ทธ๊ฒ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ ์๋ ์๋์ง๋ฅผ ๋ถ์ํ ์ ์์ ์ ๋๋ก ์ค๋ ฅ์ด ์ฑ์ฅํด์ ๋ฟ๋ฏํ๋ค. ๐
'Algo Rhythm๐บ๐ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
-