1. ๋ฌธ์ ์ค๋ช
์คํธ๋ฆฌ๋ฐ ์ฌ์ดํธ์์ ์ฅ๋ฅด ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋ ๊ฐ์ฉ ๋ชจ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ถ์ํ๋ ค ํฉ๋๋ค. ๋ ธ๋๋ ๊ณ ์ ๋ฒํธ๋ก ๊ตฌ๋ถํ๋ฉฐ, ๋ ธ๋๋ฅผ ์๋กํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
- ์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
- ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
๋ ธ๋์ ์ฅ๋ฅด๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด genres์ ๋ ธ๋๋ณ ์ฌ์ ํ์๋ฅผ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด plays๊ฐ ์ฃผ์ด์ง ๋, ๋ฒ ์คํธ ์จ๋ฒ์ ๋ค์ด๊ฐ ๋ ธ๋์ ๊ณ ์ ๋ฒํธ๋ฅผ ์์๋๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ์ฌํญ
- genres[i]๋ ๊ณ ์ ๋ฒํธ๊ฐ i์ธ ๋ ธ๋์ ์ฅ๋ฅด์ ๋๋ค.
- plays[i]๋ ๊ณ ์ ๋ฒํธ๊ฐ i์ธ ๋ ธ๋๊ฐ ์ฌ์๋ ํ์์ ๋๋ค.
- genres์ plays์ ๊ธธ์ด๋ ๊ฐ์ผ๋ฉฐ, ์ด๋ 1 ์ด์ 10,000 ์ดํ์ ๋๋ค.
- ์ฅ๋ฅด ์ข ๋ฅ๋ 100๊ฐ ๋ฏธ๋ง์ ๋๋ค.
- ์ฅ๋ฅด์ ์ํ ๊ณก์ด ํ๋๋ผ๋ฉด, ํ๋์ ๊ณก๋ง ์ ํํฉ๋๋ค.
- ๋ชจ๋ ์ฅ๋ฅด๋ ์ฌ์๋ ํ์๊ฐ ๋ค๋ฆ ๋๋ค.
์ ์ถ๋ ฅ ์
gernes | plays | return |
["classic", "pop", "classic", "classic", "pop"] |
[500, 600, 150, 800, 2500] | [4, 1, 3, 0] |
classic ์ฅ๋ฅด๋ 1,450ํ ์ฌ์๋์์ผ๋ฉฐ, classic ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ณ ์ ๋ฒํธ 3: 800ํ ์ฌ์
- ๊ณ ์ ๋ฒํธ 0: 500ํ ์ฌ์
- ๊ณ ์ ๋ฒํธ 2: 150ํ ์ฌ์
pop ์ฅ๋ฅด๋ 3,100ํ ์ฌ์๋์์ผ๋ฉฐ, pop ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ณ ์ ๋ฒํธ 4: 2,500ํ ์ฌ์
- ๊ณ ์ ๋ฒํธ 1: 600ํ ์ฌ์
๋ฐ๋ผ์ pop ์ฅ๋ฅด์ [4, 1]๋ฒ ๋ ธ๋๋ฅผ ๋จผ์ , classic ์ฅ๋ฅด์ [3, 0]๋ฒ ๋ ธ๋๋ฅผ ๊ทธ๋ค์์ ์๋กํฉ๋๋ค.
- ์ฅ๋ฅด ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ์ต๋ ๋ ๊ฐ๊น์ง ๋ชจ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ถ์ํ๋ฏ๋ก 2๋ฒ ๋ ธ๋๋ ์๋ก๋์ง ์์ต๋๋ค.
2. ์ ๊ทผ๋ฐฉ์
2-1. ๋ฌธ์ ๋จ์ํ
- ์์ ์ฅ๋ฅด๊ฐ ๋ด๊ธด String ํ์ ์ ๋ฐฐ์ด๊ณผ ์ฌ์ ํ์๊ฐ ๋ด๊ธด Integer ๋ฐฐ์ด์ด ์๋ค.
- ์ฅ๋ฅด๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ์์ ๊ณผ ๋ ๋ฒ์งธ๋ก ๋ง์ด ์ฌ์๋ ์์ ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ฃ๋๋ค. => ์ฅ๋ฅด๋ณ๋ก 1,2์ ๋ ๊ณก์ฉ ์ ๋ฐ
2-2. ํด๊ฒฐ์ฑ
- ์ฅ๋ฅด๋ณ ์ฌ์ํ์ ์ ์ฅ
HashMap<String, Integer> num
classic | pop |
800+500+150 | 2,500+600 |
์ฅ๋ฅด์ ์ํ ๋ ธ๋์ <์ธ๋ฑ์ค ๋ฒํธ, ์ฌ์ ํ์> ์ ์ฅ
- HashMap<String, HashMap<Integer, Integer>> music
classic | pop |
[0:500, 2:150, 3:800] | [1:600, 4:2,500] |
์ํ ๋ ธ๋๊ฐ ๊ฐ์ฅ ๋ง์ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์ฌ์ํด์ผ ํ๋ฏ๋ก, num์ ์ด ์ฌ์ํ์๊ฐ ๋ง์ ์์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
pop | classic |
3,100 | 1,450 |
์ฅ๋ฅด ๋ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ์ถ์ถํด์ผ ํ๋ฏ๋ก, music์ ์ฌ์ํ์๋๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
classic | pop |
[3:800, 0:500, 2:150] | [4:2,500, 1:600] |
์ ๋ ฌ๋ num์ ์์๋๋ก music์์ ์ ๋ ฌ๋ ๊ณก๋ค ์ค ์์ 2๊ณก์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ album(ArrayList)์ ์ถ๊ฐ
ArrayList<Integer> album
=> 4,1,3,0 ์ด ์ถ๊ฐ๋จ
ArrayList๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด ๋ฆฌํด
[4, 1, 3, 0]
3. ๋ฌธ์ ํ์ด
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
// 1. ๋ฒ ์คํธ์จ๋ฒ์ ๋ค์ด๊ฐ ๋
ธ๋ ๋ด์ ArrayList ์์ฑ
ArrayList<Integer> album = new ArrayList<>();
// 2. ์ฅ๋ฅด๋ณ ์ด ์ฌ์ํ์ ์ ์ฅํ HashMap num ์ ์ธ
HashMap<String, Integer> num = new HashMap<>();
// 3. ์ฅ๋ฅด๋ณ๋ก ๊ฐ ๋
ธ๋(๊ณ ์ ์ธ๋ฑ์ค ๋ฒํธ)์ ์ฌ์ํ์๋ฅผ
// ์ ์ฅํ HashMap music ์ ์ธ
HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>();
for(int i = 0; i < genres.length; i++) {
// genres ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์์ง
if(!num.containsKey(genres[i])) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(i, plays[i]); // ์๋ก์ด ๋
ธ๋ ์ธ๋ฑ์ค์ ์ฌ์ ํ์ ์ถ๊ฐ
music.put(genres[i], map); // ์๋ก์ด ์ฅ๋ฅด์ ๋
ธ๋ ์ ๋ณด๋ฅผ ์ถ๊ฐ
num.put(genres[i], plays[i]); // ํด๋น ์ฅ๋ฅด์ ์ด ์ฌ์ ํ์๋ฅผ ์ด๊ธฐํ
} else {
music.get(genres[i]).put(i, plays[i]);
// ๊ธฐ์กด ์ฅ๋ฅด์ ๋
ธ๋ ์ธ๋ฑ์ค์ ์ฌ์ ํ์ ์ถ๊ฐ
num.put(genres[i], num.get(genres[i]) + plays[i]);
// ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ํ์ ๋์
}
}
// 4. ์ ๋ ฌ์ ์ํด์ num์ KeySet(์ฅ๋ฅด๋ช
)์ ๋ฆฌ์คํธ๋ก ๋ณํ
List<String> keySet = new ArrayList<>(num.keySet());
Collections.sort(keySet, (s1, s2) -> num.get(s2) - num.get(s1));
// ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ํ์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
for (String key : keySet) {
HashMap<Integer, Integer> map = music.get(key);
List<Integer> genreKey = new ArrayList<>(map.keySet());
// ์ฌ์ ํ์์ ๋ฐ๋ผ ๋
ธ๋ ์ธ๋ฑ์ค ์ ๋ ฌ
Collections.sort(genreKey, (s1, s2) -> map.get(s2) - map.get(s1));
album.add(genreKey.get(0)); // ์ฒซ ๋ฒ์งธ ๊ณก ์ถ๊ฐ
if(genreKey.size() > 1) {
album.add(genreKey.get(1)); // ๋ ๋ฒ์งธ ๊ณก ์ถ๊ฐ (์์ ๊ฒฝ์ฐ)
}
}
// ArrayList๋ฅผ int[]๋ก ๋ณํํ์ฌ ๋ฐํ
return album.stream().mapToInt(i -> i).toArray();
}
}
num ํด์๋งต์์ ์ด ์ฌ์ ํ์๊ฐ ํฐ ์ฅ๋ฅด ์์๋๋ก ์ ๋ ฌํ ๊ฐ์ ๋ฐ์์ค๋ keySet ๋ฆฌ์คํธ
List<String> keySet = new ArrayList<>(num.keySet());
Collections.sort(keySet, (s1, s2) -> num.get(s2) - num.get(s1));
- List<String> keySet = new ArrayList<>(num.keySet());
- num.keySet()์ num์ด๋ผ๋ ํด์๋งต์ ํค๋ค์ ๊ฐ์ ธ์ด. => ๊ฐ ์ฅ๋ฅด๋ช ์ ํฌํจํ๋ Set<String>์ด ๋ฐํ๋จ
- ์ด ํค๋ค์ ArrayList๋ก ๋ณํํ์ฌ keySet ๋ฆฌ์คํธ์ ์ ์ฅํ ๊ฒ.
- Collections.sort(keySet, (s1, s2) -> num.get(s2) - num.get(s1));:
- Collections.sort() ๋ฉ์๋๋ก keySet์ ์ ๋ ฌ
- (s1, s2) -> num.get(s2) - num.get(s1)๋ ๋๋ค์์ผ๋ก, ์ฅ๋ฅด๋ช ์ ๋น๊ตํด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
- s1, s2๋ genreKey ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค
- num.get(s1)์ num.get(s2)๋ ๋ ์ฅ๋ฅด s1๊ณผ s2์ ์ด ์ฌ์ ํ์
- num.get(s2) - num.get(s1)๋ ๋ ์ฅ๋ฅด s1๊ณผ s2์ ์ด ์ฌ์ ํ์ ์ฐจ์ด๋ฅผ ๊ตฌํ์ฌ, ์ฌ์ ํ์๊ฐ ํฐ ์ฅ๋ฅด๊ฐ ์์ ์ค๋๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํฉ๋๋ค. <-> num.get(s1) - num.get(s2)์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ์์: ๋ง์ฝ map.get(s2)๊ฐ map.get(s1)๋ณด๋ค ํฌ๋ฉด (์ฆ, s2์ ์ฌ์ ํ์๊ฐ ๋ ํฌ๋ฉด), ๊ฒฐ๊ณผ๋ ์์๊ฐ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ, s2๊ฐ s1๋ณด๋ค ์์ ์ค๋๋ก ์ ๋ ฌ => ๊ทธ๋์ ๋ด๋ฆผ์ฐจ์
- ์์: ๋ฐ๋๋ก, map.get(s1)์ด map.get(s2)๋ณด๋ค ํฌ๋ฉด, ๊ฒฐ๊ณผ๋ ์์๊ฐ ๋์ด s1์ด s2๋ณด๋ค ์์ ์ด.
- 0 : ๋ ์ฌ์ ํ์๊ฐ ๊ฐ์ผ๋ฉด ๊ฒฐ๊ณผ๋ 0์ด ๋์ด ๋ ์์์ ์์๋ ๋ณ๊ฒฝ ์ ๋จ.
return album.stream().mapToInt(i -> i).toArray();
๋ฌธ์ ์์ ๋ฐฐ์ด ํ์์ผ๋ก ๊ฐ์ ๋ฆฌํดํ๋ฏ๋ก, album์ด๋ผ๋ ArrayList๋ฅผ int ๋ฐฐ์ด๋ก ๋ณํ
3. album.stream():
- album์ ArrayList<Integer> ํ์์ ๋๋ค. stream() ๋ฉ์๋๋ ์ด ๋ฆฌ์คํธ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ๋ณํ
4. mapToInt(i -> i):
- ์คํธ๋ฆผ์ ๊ฐ ์์๋ฅผ int ํ์์ผ๋ก ๋ณํ(๋งคํ) : mapToInt(Integer::intValue)
- ์ฌ๊ธฐ์ i๋ album ๋ฆฌ์คํธ์ ๊ฐ ์์
- i -> i๋ Integer ๊ฐ์ฒด๋ฅผ int ํ์ ์ผ๋ก ๋ณํํ๋ ๋๋ค ํํ์
5. toArray():
- ์คํธ๋ฆผ์ ์์๋ค์ ๋ฐฐ์ด๋ก ์์ง
- mapToInt๋ฅผ ์ฌ์ฉํ์ฌ int ํ์ ์ผ๋ก ๋ณํ๋ ์คํธ๋ฆผ์ด int[] ๋ฐฐ์ด๋ก ๋ณํ๋จ.
- ์ฆ toArray()๋ int ๋ฐฐ์ด์ ๋ฐํ
4. ๊ฐ์ ์ ํ ๋ฌธ์ (ํด์๋งต)