1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
KEY WORD
: Sorting
, HashMap
- ์์
๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ( ๋ฉค๋ฒ ๋ณ์: ์์ ์
๊ณ ์ ๋ฒํธ
,์ฅ๋ฅด
,ํ๋ ์ด ํ์
) - ์ ๋ ฅ ๊ฐ๋ค์ ์ ๋ถ ์์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ ArrayList์ ์ถ๊ฐํ๋ค.
- HashMap์ ๋ง๋ ๋ค. Key =
์ฅ๋ฅด
, value =์ฅ๋ฅด์ ํด๋นํ๋ ๊ณก๋ค์ ํ๋ ์ด ์ดํฉ
- 2๋ฒ์์ ๋ง๋ ArrayList๋ฅผ ์ ๋ ฌํ๋ค. ์ ๋ ฌ ๊ธฐ์ค์ ๋ฌธ์ ๊ทธ๋๋ก๋ค. -> Comparator๋ฅผ ๋จ์ํํ Lamda ์์ ์ด์ฉํด ๊ตฌํ
- ๋ต๋ณ์ฉ ansList๋ฅผ ๋ง๋ค๊ณ , ๋ต๋ณ์ ์ฅ๋ฅด๋ณ๋ก ๋ช ๋ฒ ๋ค์ด๊ฐ๋์ง๋ฅผ ๋ํ๋ด๋ genreAddedCount๋ผ๋ HashMap๋ ํ๋ ๋ ๋ง๋ ๋ค.
- genreAddedCount๋ Key =
์ฅ๋ฅด
, value =์ฅ๋ฅด ๋ณ๋ก ๋ต๋ณ List์ ๋์จ ํ์
์ด๋ค. .get(์ฅ๋ฅด) < 2 ์ด๋ฉด ๋ต๋ณ์ ๋ฃ๊ณ ์๋๋ฉด ๊ทธ๋ฅ ์ง๋์น๋ค.
(์ด๋ ๊ฒ ํ๋ฉด, ์ฅ๋ฅด์ ํด๋นํ๋ ๊ณก์ด ํ๋์ธ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์์ธ์ฒ๋ฆฌ ์์ด ์ถ๊ฐ ๋ฐ ๋์ด๊ฐ ์ ์๊ณ , 3๊ฐ ์ด์์ธ ๊ฒฝ์ฐ๋ 2๊ฐ๋ง ๋ฃ๊ณ ๋์ด๊ฐ ์ ์๋ค.)
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
// 1.
ArrayList<Music> playList = new ArrayList<>();
// 2.
HashMap<String, Integer> map = new HashMap<>();
// -- ์
๋ ฅ
for(int i = 0; i < genres.length; i++){
playList.add(new Music(i, genres[i], plays[i]));
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
}
// ํ๋ ์ด๋ฆฌ์คํธ ์ ๋ ฌ
Collections.sort(playList, (o1,o2) -> {
// ์ฅ๋ฅด๋ ๊ฐ๊ณ , ํ๋ ์ด ํ์๋ ๊ฐ์ผ๋ฉด ๊ณ ์ ๋ฒํธ๋ก ์ค๋ฆ์ฐจ์
if(o1.genre.equals(o2.genre) && o2.play == o1.play){
return o1.num - o2.num;
}
// ์ฅ๋ฅด๊ฐ ๊ฐ๋ค๋ฉด ํ๋ ์ด ํ์๋ก ๋ด๋ฆผ์ฐจ์
if(o1.genre.equals(o2.genre)){
return o2.play - o1.play;
}
// ์ ์ผ ๋ง์ด ํ๋ ์ด๋ ์ฅ๋ฅด๊ฐ ์์ ์ค๋๋ก ๋ด๋ฆผ์ฐจ์
return map.get(o2.genre) - map.get(o1.genre);
});
// ์ฅ๋ฅด ๋์จ ํ์ ์ธ๋ ๊ฒ
HashMap<String, Integer> genreAddedCount = new HashMap<>();
ArrayList<Integer> ansList = new ArrayList<>();
for(Music now : playList) {
// ํ ๋ฒ ์ญ ํ์ธํด๋ณด์ธ์!
System.out.printf("๋ฒํธ: %d, ์ฅ๋ฅด: %s, ํ๋ ์ด ์: %d\n", now.num, now.genre, now.play);
if(genreAddedCount.getOrDefault(now.genre, 0) < 2){
ansList.add(now.num);
genreAddedCount.put(now.genre, genreAddedCount.getOrDefault(now.genre, 0) + 1);
}
}
return ansList.stream().mapToInt(i -> i).toArray();
}
}
class Music {
int num;
String genre;
int play;
public Music(int num, String genre, int play){
this.num = num;
this.genre = genre;
this.play = play;
}
}
4. ์ฑ์ฅํ๊ธฐ
(1) Stream ์ฌ์ฉ๋ฒ
ansList.stream().mapToInt(i -> i).toArray();
mapToInt(i -> i)
๋ Stream< Integer > ๋ผ๋ WrapperClass๋ฅผ IntStream ์ด๋ผ๋ ์์ํ ํด๋์ค์ Stream์ผ๋ก ๋ฐ๊ฟ์ค๋ค. ์ด์ ๋น์ทํ ํจ์๋ก๋ mapToLong, mapToDouble ๋ฑ์ด ์๋ค.
toArray()
: Stream< T >๋ฅผ Object[] ๋ก ๋ณํํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด์ง๋ง, ํด๋น ๋ฌธ์ ์์๋ mapToInt()
๋ฅผ ํตํด Stream ํด๋์ค๋ฅผ IntStream์ด๋ ์์ํ Stream์ผ๋ก ๋ณํํ๋ค. IntStream.toArray๋ int[]๋ฅผ ๋ฐํํ๋ค.
(2) ๋ง์ง๋ง ์ถ๋ ฅ์์์ ์คํ๊ฒํฐ ์ฝ๋
ํด๋น ๋ต๋ณ์ GPT์ ์กฐ์ธ์ ๊ตฌํ๋ฉฐ ๋ง๋ค์๋ค. ๊ทธ ์ ๋์ ์ฝ๋๋ 100์ ์ค 86.7์ ์ ๋ฐ์ผ๋ฉฐ, ํ
์คํธ์ผ์ด์ค 2๊ฐ๋ฅผ ํต๊ณผํ์ง ๋ชปํ๋ค. GPT๊ฐ ์ง์ค ์ฝ๋์ ๋ค๋ฅธ ๊ฒ์ ๋ค ์ผ์นํ์ผ๋, ๋งจ ๋ฐ์ ์ฅ๋ฅด ๋ณ 2๊ฐ์ ์ธ๊ธฐ๊ณก๋ง ๋ฝ์์ ์จ๋ฒ์ ๋ฃ๊ธฐ
๋ฅผ ์คํจํ๋ค.
for(Music now : playList) {
System.out.printf("๋ฒํธ: %d, ์ฅ๋ฅด: %s, ํ๋ ์ด ์: %d\n", now.num, now.genre, now.play);
// ํ์ฌ ๋ณด๊ณ ์๋ ์ฅ๋ฅด์ ๋์จ ๊ณก ์ < 2 && ์ด์ ์ฅ๋ฅด์ ๊ฐ์ ์
if(cnt < 2 && now.genre.equals(prev)){
// ๊ณ ์ ๋ฒํธ ์
๋ ฅ
ans[iter++] = now.num;
// ์ฅ๋ฅด์์ ๋์จ ๊ณก ์ ++
cnt++;
// ์ฅ๋ฅด์ ๊ณก์ด ํ๋๋ฐ์ ์๋ค๋ฉด ๊ทธ๋ฅ ๋ฐ๋ก 2๋ก ์ฒ๋ฆฌ
if(map_cnt.get(now.genre) == 1){
cnt = 2;
}
}
// 2์ธ์ฑ๋ก ์ง๋๊ฐ๋ ๊ณก๋ค ์ ๋ถ continue๋ก ์ง๋๊ฐ๊ธฐ
if(cnt == 2 && now.genre.equals(prev)){
continue;
}
// cnt == 2์ธ๋ฐ, ์ฅ๋ฅด๊ฐ ๋ฐ๋์๋ค.
if(cnt == 2 && !now.genre.equals(prev)){
// ํด๋น ๊ณก์ ๋ฐ๋ก ์ ์ฅํ๋ฏ๋ก, cnt == 1์ธ์ฑ๋ก ์์
cnt = 1;
// ๋ต๋ณ์ ๋ฃ๊ธฐ, ์ด์ ์ฅ๋ฅด ๊ฐฑ์
ans[iter++] = now.num;
prev = now.genre;
}
}
์ด์ ๊ฐ์ด cnt == 2๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ผ์ผํ ์
๋๋ฐ, ์ด๋ ๊ฒ ํ๋, ์ฅ๋ฅด๊ฐ ๋ฐ๋ ๋, ์ฅ๋ฅด์ ํด๋นํ๋ ๊ณก์ด ํ ๊ฐ ๋ฟ์ผ ๋, ์ด๊ธฐํ ์์
์์ ์ค๋ฅ๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
๋๋ ์ฅ๋ฅด ์์ ๊ณก์ด ํ ๊ฐ์ธ ๊ฒฝ์ฐ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด์ ์๊ฐํด์ค์ผ ํ๋ค๊ณ ๋๊ปด์ ์ฝ๋๋ฅผ ์ด์ง๋ฝ๊ฒ ์งฐ๋ค. GPTํํ
๋ด ์ฝ๋์ ๋ฐ๋ก๋ฅผ ๋ง๋ค์ด๋ฌ๋ผ ํ์ง๋ง, GPT๊ฐ ๋ง๋ ๊ฑด ๋ค ํต๊ณผํด์ ์ค๋ฅ๋ฅผ ์๋ฒฝํ ์ฐผ๋๋ฐ๋ ์คํจํ๋ค. ํ์ง๋ง, ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํ์ง ์์ผ๋ฉด์๋ ๊ฐํธํ ์ฝ๋๋ฅผ ์๊ฒ๋์ด ๊ธฐ์๋ค.
// GPT ์ฝ๋
for(Music now : playList) {
System.out.printf("๋ฒํธ: %d, ์ฅ๋ฅด: %s, ํ๋ ์ด ์: %d\n", now.num, now.genre, now.play);
if(genreAddedCount.getOrDefault(now.genre, 0) < 2){
ansList.add(now.num);
genreAddedCount.put(now.genre, genreAddedCount.getOrDefault(now.genre, 0) + 1);
}
}
์์ ๊ฐ์ด map์ .getOrDefault()๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ ๋ ์ค์ด๋ฉด ๋๋ค๋ ์ ์์ ๊ฐํธํ๋ค.