내가 짠 코드(통과)
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
Map<String,Genre> genreMap=new HashMap<String,Genre>();
List<Genre> genreList=new ArrayList<Genre>();
//key: name
for (int i=0;i<genres.length;i++) {
String name=genres[i];
if(genreMap.get(name)==null){
Genre gen=new Genre(name);
gen.indexList.add(i);
gen.genrePlaySum=plays[i];
genreMap.put(name,gen);
genreList.add(gen);
}else{
Genre genre = genreMap.get(name);
genre.indexList.add(i);
genre.genrePlaySum+=plays[i];
}
}
// genreMap.forEach((s, genre) -> {
// System.out.println("s = " + s);
// System.out.println("genre = " + genre);
// });
//System.out.println("================================================================");
List<Integer> ansList=new ArrayList<Integer>();
//인기 장르 순 배치
Collections.sort(genreList, new Comparator<Genre>() {
@Override
public int compare(Genre o1, Genre o2) {
return o2.genrePlaySum-o1.genrePlaySum;
}
});
//genreList.forEach(genre -> System.out.println("genre = " + genre));
//장르별 top2 선정 및 add to answer
for (Genre genre : genreList) {
int top1,top2;
top1=top2=-1;
int top1Value,top2Value;
top1Value=top2Value=-1;
//System.out.println("now : genre = " + genre);
for (Integer integer : genre.indexList) {
//System.out.println("now integer: " + integer);
if(plays[integer]>top1Value){
//System.out.println("new top1");
if(top1!=-1){
//System.out.println("top1 go to top2");
top2=top1;
top2Value = top1Value;
}
top1=integer;
top1Value=plays[integer];
}else if(plays[integer]>top2Value){
//System.out.println("new top2");
top2=integer;
top2Value=plays[integer];
}
}
ansList.add(top1);
if(top2!=-1)
ansList.add(top2);
}
return ansList.stream().mapToInt(i->i).toArray();
}
class Genre{
String name;
@Override
public String toString() {
return "Genre{" +
"name='" + name + '\'' +
", indexList=" + indexList +
", genrePlaySum=" + genrePlaySum +
'}';
}
List<Integer> indexList=new ArrayList<>();
int genrePlaySum=0;
public Genre(String name) {
this.name = name;
}
}
}
다른 분이 짠 스트림 활용2000% 코드
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public class Music implements Comparable<Music>{
private int played;
private int id;
private String genre;
public Music(String genre, int played, int id) {
this.genre = genre;
this.played = played;
this.id = id;
}
@Override
public int compareTo(Music other) {
if(this.played == other.played) return this.id - other.id;
return other.played - this.played;
}
public String getGenre() {return genre;}
}
public int[] solution(String[] genres, int[] plays) {
return IntStream.range(0, genres.length)
.mapToObj(i -> new Music(genres[i], plays[i], i))
.collect(Collectors.groupingBy(Music::getGenre))
.entrySet().stream()
.sorted((a, b) -> sum(b.getValue()) - sum(a.getValue()))
.flatMap(x->x.getValue().stream().sorted().limit(2))
.mapToInt(x->x.id).toArray();
}
private int sum(List<Music> value) {
int answer = 0;
for (Music music : value) {
answer+=music.played;
}
return answer;
}
}
문제 자체는 평이했다.
근데, 통과 후 다른 사람의 풀이를 보니 스트림 활용을 저렇게도 할 수 있구나 싶은 코드가 나와 같이 올렸다 !
스트림.. 공부 좀 더 해야겠다
'Algorithm > Programmers' 카테고리의 다른 글
[Lv.3] 자물쇠와 열쇠 (0) | 2023.04.13 |
---|---|
[Lv.3] 경주로 건설 (0) | 2023.04.12 |
[Lv.3] 디스크 컨트롤러 (0) | 2023.04.12 |
[Lv.3] 정수 삼각형 (0) | 2023.04.12 |
[Lv.3] 합승 택시 요금 (0) | 2023.04.12 |