๐ง LV3. ๋ฒ ์คํธ ์จ๋ฒ
๋ฌธ์ ์ค๋ช
์คํธ๋ฆฌ๋ฐ ์ฌ์ดํธ์์ ์ฅ๋ฅด ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋ ๊ฐ์ฉ ๋ชจ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ถ์ํ๋ ค ํฉ๋๋ค. ๋ ธ๋๋ ๊ณ ์ ๋ฒํธ๋ก ๊ตฌ๋ถํ๋ฉฐ, ๋ ธ๋๋ฅผ ์๋กํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
2. ์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
3. ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
๋ ธ๋์ ์ฅ๋ฅด๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด genres์ ๋ ธ๋๋ณ ์ฌ์ ํ์๋ฅผ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด plays๊ฐ ์ฃผ์ด์ง ๋, ๋ฒ ์คํธ ์จ๋ฒ์ ๋ค์ด๊ฐ ๋ ธ๋์ ๊ณ ์ ๋ฒํธ๋ฅผ ์์๋๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์ฌํญ
genres[i]๋ ๊ณ ์ ๋ฒํธ๊ฐ i์ธ ๋ ธ๋์ ์ฅ๋ฅด์ ๋๋ค.
plays[i]๋ ๊ณ ์ ๋ฒํธ๊ฐ i์ธ ๋ ธ๋๊ฐ ์ฌ์๋ ํ์์ ๋๋ค.
genres์ plays์ ๊ธธ์ด๋ ๊ฐ์ผ๋ฉฐ, ์ด๋ 1 ์ด์ 10,000 ์ดํ์ ๋๋ค.
์ฅ๋ฅด ์ข ๋ฅ๋ 100๊ฐ ๋ฏธ๋ง์ ๋๋ค.
์ฅ๋ฅด์ ์ํ ๊ณก์ด ํ๋๋ผ๋ฉด, ํ๋์ ๊ณก๋ง ์ ํํฉ๋๋ค.
๋ชจ๋ ์ฅ๋ฅด๋ ์ฌ์๋ ํ์๊ฐ ๋ค๋ฆ ๋๋ค.
์ ์ถ๋ ฅ ์
genres | plays | return |
["classic", "pop", "classic", "classic", "pop"] | [500, 600, 150, 800, 2500] | [4, 1, 3, 0] |
https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
๐ก ๋ฌธ์ ํ์ด
์ฌ๋ฐ๋ ๋ฌธ์ ์๋ค! ์ผ๋จ ๋ฌธ์ ์ค๋ช ๋ง ์ฝ์ด๋ดค์ ๋๋ ์ฝ๊ฒ ํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋๋ฐ, ๋ง์ ํ์ด๋ณด๋ ์๊ฐํด์ผ ํ ์กฐ๊ฑด์ด ๋ช ์์๋ค. ์ด ๋ฌธ์ ์์๋ Class์ ์ ๋ ฌ ์กฐ๊ฑด, ๊ทธ๋ฆฌ๊ณ Hash๋ฅผ ์ฌ์ฉํ๋ค.
๋จผ์ ์ ๋ ฌ ์กฐ๊ฑด์ ๋ง์ถฐ์ Class์ compareTo ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค.
์ฌ๊ธฐ์๋ Song ์ด๋ฆ์ Class๋ฅผ ์ ์ํ๊ณ , Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
static Map<String, Integer> genreTotalPlay;
static class Song implements Comparable<Song> {
int id;
String genre;
int playCnt;
Song(int id, String genre, int playCnt) {
this.id = id;
this.genre = genre;
this.playCnt = playCnt;
}
@Override
public int compareTo(Song o) {
if (genreTotalPlay.get(this.genre) == genreTotalPlay.get(o.genre)) {
if (this.playCnt == o.playCnt) {
return this.id - o.id;
}
return o.playCnt - this.playCnt;
}
return genreTotalPlay.get(o.genre) - genreTotalPlay.get(this.genre);
}
}
์ฌ๊ธฐ์ genreTotalPlay๋ ์ฅ๋ฅด์ ์ ์ฒด ์ฌ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋ HashMap ๋ณ์์ด๋ค.
์ ๋ ฌ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ญ Map ํ์ ๋ณ์๋ฅผ ์ฌ์ฉํด์, ์ฅ๋ฅด์ ์ ์ฒด ์ฌ์ ์(genreTotalPlay.get(Song.genre))๋ฅผ ๋จผ์ ๋น๊ตํด์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
์ฅ๋ฅด(์ฅ๋ฅด์ ์ ์ฒด ์ฌ์ ์)๊ฐ ๊ฐ๋ค๋ฉด, ๋ ธ๋์ ์ฌ์ ์(Song.playCnt)๋ฅผ ๋น๊ตํด์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
๋ ธ๋์ ์ฌ์ ์๋ ๊ฐ๋ค๋ฉด, ๊ณ ์ ๋ฒํธ(id)๋ฅผ ๋น๊ตํด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
ํด๋์ค๋ฅผ ์ ์ํ์ผ๋ฉด, ์ด์ ์ฅ๋ฅด ์ ์ฒด ์ฌ์ ์๋ฅผ ์ ์ญ Hash ๋ณ์์ ์ ์ฅํด์ฃผ๊ณ , ๊ฐ ๋ ธ๋๋ฅผ ๋ฆฌ์คํธ ์ ์ฅ ๋ฐ ์ ๋ ฌํด์ค๋ค.
genreTotalPlay = new HashMap<>(); // ์ฅ๋ฅด ์ ์ฒด ์ฌ์ ์(์ ์ญ ๋ณ์)
List<Song> songs = new ArrayList<>(); // ๋
ธ๋ ์ ๋ณด ๋ฆฌ์คํธ
for (int i = 0; i < genres.length; i++) {
if (!genreTotalPlay.containsKey(genres[i])) genreTotalPlay.put(genres[i], 0);
genreTotalPlay.put(genres[i], genreTotalPlay.get(genres[i]) + plays[i]);
songs.add(new Song(i, genres[i], plays[i]));
}
Collections.sort(songs);
genres์ plays ๋ฐฐ์ด์ ๋๋ฉด์ "์ฅ๋ฅด ์ ์ฒด ์ฌ์ ์(genreTotalPlay)"์ "๋ ธ๋ ์ ๋ณด ๋ฆฌ์คํธ(songs)" ๋ณ์๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋ค.
๋ฐ๋ณต๋ฌธ ์ข ๋ฃ ํ, ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ฉด ์์์ ์ฌ์ ์ํ ์ ๋ ฌ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ ฌ๋๋ค.
๋ง์ง๋ง ๋จ์ ๋ฌธ์ ์ ์กฐ๊ฑด์ด ์๋ค. "๊ฐ์ ์ฅ๋ฅด์์ ์ต๋ 2๊ฐ์ ๋ ธ๋๋ง ์๋กํ๋ค"๋ ์กฐ๊ฑด์ด๋ค. ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด์ ์์์ ์ ์ฅํ songs ๋ฆฌ์คํธ์์ ๊ฐ์ ์ฅ๋ฅด์ ์ต๋ 2๊ฐ์ ๋ ธ๋๋ง ๋จ์์๋๋ก ํํฐ๋งํด์ฃผ์ด์ผ ํ๋ค. ์ด ๋ํ HashMap ๋ณ์๋ฅผ ์ฌ์ฉํด์, ๊ฐ์ ์ฅ๋ฅด์ ๋ํด์ 3๋ฒ์งธ ๋ ธ๋๋ถํฐ๋ ๊ฑธ๋ฌ์ฃผ๋ฉด ๋๋ค.
Map<String, Integer> genreCount = new HashMap<>();
List<Integer> album = new ArrayList<>();
for (Song song : songs) {
if (!genreCount.containsKey(song.genre)) genreCount.put(song.genre, 0);
if (genreCount.get(song.genre) >= 2) continue;
genreCount.put(song.genre, genreCount.get(song.genre) + 1);
album.add(song.id);
}
genreCount ๋ณ์๋ฅผ ํ์ฉํด์ ๊ฐ์ ์ฅ๋ฅด์ ๋ํด ์ ๋์ ์๋ ์ต๋ 2๊ฐ์ ๋ ธ๋๋ง album ๋ฆฌ์คํธ์ ์ ์ฅํด์ค๋ค. ์ด๋ฏธ ์์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋ ฌํ์ผ๋ฏ๋ก ์์๋๋ก ํ๋จํ๋ฉด ๋๋ค.
์ ํ์ด ๋ฐฉ๋ฒ์ ์ ์ฒด ์ฝ๋๋ก ํ์ด๋ด๋ฉด ์๋์ ๊ฐ๋ค.
import java.util.*;
class Solution {
static Map<String, Integer> genreTotalPlay;
static class Song implements Comparable<Song> {
int id;
String genre;
int playCnt;
Song(int id, String genre, int playCnt) {
this.id = id;
this.genre = genre;
this.playCnt = playCnt;
}
@Override
public int compareTo(Song o) {
if (genreTotalPlay.get(this.genre) == genreTotalPlay.get(o.genre)) {
if (this.playCnt == o.playCnt) {
return this.id - o.id;
}
return o.playCnt - this.playCnt;
}
return genreTotalPlay.get(o.genre) - genreTotalPlay.get(this.genre);
}
}
public int[] solution(String[] genres, int[] plays) {
// ์ฅ๋ฅด์ ์ ์ฒด ์ฌ์ ์ ๊ตฌํ๊ธฐ & ๋
ธ๋ ์์ ์ ๋ ฌํ๊ธฐ
genreTotalPlay = new HashMap<>();
List<Song> songs = new ArrayList<>();
for (int i = 0; i < genres.length; i++) {
if (!genreTotalPlay.containsKey(genres[i])) genreTotalPlay.put(genres[i], 0);
genreTotalPlay.put(genres[i], genreTotalPlay.get(genres[i]) + plays[i]);
songs.add(new Song(i, genres[i], plays[i]));
}
Collections.sort(songs);
// ๊ฐ์ ์ฅ๋ฅด ์ต๋ 2๊ฐ๊น์ง๋ง ๋
ธ๋ ์๋กํ๊ธฐ
Map<String, Integer> genreCount = new HashMap<>();
List<Integer> album = new ArrayList<>();
for (Song song : songs) {
if (!genreCount.containsKey(song.genre)) genreCount.put(song.genre, 0);
if (genreCount.get(song.genre) >= 2) continue;
genreCount.put(song.genre, genreCount.get(song.genre) + 1);
album.add(song.id);
}
// ArrayList to Array ๋ณํ
int[] answer = new int[album.size()];
for (int i = 0; i < album.size(); i++) {
answer[i] = album.get(i);
}
return answer;
}
}
โจ ํฌ์คํ ์ ๋ง์น๋ฉฐ
ํด๋์ค๋ฅผ ํ์ฉํด์ ์ ๋ ฌ ์กฐ๊ฑด์ ์ฌ์ ์ํ๊ณ , ๋ต์ ๋์ถํด๋ด๋ ๊ณผ์ ์ด ์ฌ๋ฐ์๋ค. ์ธ์ ๋ถํด๊ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์๋ ํด๋์ค ์ ์๋ฅผ ์ ๊ทน ํ์ฉํ๊ณ ์๋๋ฐ, ๊ฐ๋ ์ฑ๋ ์ข์์ง๊ณ ํ์ฉ๋๋ ์ข์ ๊ฒ ๊ฐ๋ค. ๐
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ๊ธฐ๋ฅ๊ฐ๋ฐ (Queue, ํ) (0) | 2023.10.17 |
---|---|
[๋ฐฑ์ค 1162] ๋๋กํฌ์ฅ (Dijkstra, ๋ค์ต์คํธ๋ผ) (2) | 2023.10.16 |
[๋ฐฑ์ค 1446] ์ง๋ฆ๊ธธ (Dijkstra, ๋ค์ต์คํธ๋ผ) (0) | 2023.10.15 |
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ์ ํ๋ฒํธ ๋ชฉ๋ก (Hash, ํด์) (0) | 2023.10.14 |
[๋ฐฑ์ค 1629] ๊ณฑ์ (๋ถํ ์ ๋ณต, Divide and Conquer) (0) | 2022.11.26 |