https://programmers.co.kr/learn/courses/30/lessons/42579
ํ๋ฆฐ ์ฝ๋
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public static int[] solution(String[] genres, int[] plays) {
List<Integer> list = new ArrayList<>();
int length = genres.length;
Map<String, Integer> map = getSumOfGenres(genres, plays);
Album[] albums = getAlbums(genres, plays, map);
// 1) ์ฌ์ ๋
ธ๋ ํ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ์์ผ๋ก ์ค๋ฆ์ฐจ์
// 2) ์ฌ์๋ ์ฅ๋ฅด ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ์ฌ์ ๋
ธ๋ ํ์ ์ ๋ด๋ฆผ์ฐจ์
// * ์ฌ์๋ ์ฅ๋ฅด ์ -> ์ฅ๋ฅด ๋ด์์ ์ฌ์๋ ๋
ธ๋ ํ์ -> ๋
ธ๋ ๋ณ ๊ณ ์ ๋ฒํธ(index) ์
Arrays.sort(albums, (i1, i2) -> {
if (i2.sum == i1.sum) {
if (i2.plays == i1.plays) {
return Integer.compare(i1.index, i2.index);
}
return Integer.compare(i2.plays, i1.plays);
}
return Integer.compare(i2.sum, i1.sum);
});
int count = 1;
list.add(albums[0].index);
// ์๋ชป๋ ๋ก์ง !!
for (int i = 1; i < length; i++) {
if (count == 2) {
if (albums[i].genres.equals(albums[i - 1].genres)) continue;
else count = 0;
}
list.add(albums[i].index);
count ++;
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
private static Album[] getAlbums(String[] genres, int[] plays, Map<String, Integer> map) {
Album[] albums = new Album[genres.length];
for (int i = 0; i < genres.length; i++) {
Album album = new Album(genres[i], plays[i], map.get(genres[i]), i);
albums[i] = album;
}
return albums;
}
private static Map<String, Integer> getSumOfGenres(String[] genres, int[] plays) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
}
return map;
}
static class Album {
String genres;
int plays;
int sum;
int index;
private Album() {
}
public Album(String genres, int plays, int sum, int index) {
this.genres = genres;
this.plays = plays;
this.sum = sum;
this.index = index;
}
@Override
public String toString() {
return "Album{" +
"genres='" + genres + '\'' +
", plays=" + plays +
", sum=" + sum +
", index=" + index +
'}';
}
}
}
์ ์ฝ๋๋ ํ ์คํธ์ผ์ด์ค 9๋ฒ๋ง ์คํจํ๋๋ฐ, ์ ํํ ๋ฐ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ํ ์คํธ์ผ์ด์ค์์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
genre = 'a', 'b', 'c', 'd', 'e'
์ฆ, ์ฅ๋ฅด๋ ๋ชจ๋ ๋ค๋ฅด์ง๋ง ์ ๋ก์ง์์๋ count == 2 ์ผ๋๋ง if๋ฌธ์ ํ ๋ค ์ด์ ์ ์ถ์ํ ์ฅ๋ฅด์ ํ์ฌ ์ถ์ํ ์ฅ๋ฅด๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์
์ด๋ฌํ ๋ถ๋ถ์์ ์คํจํ๋ ์ผ์ด์ค๊ฐ ์กด์ฌํ ๊ฑฐ๋ผ๊ณ ์๊ฐ์ ํ์ต๋๋ค!
์ ๋ต ์ฝ๋
package kit.hash;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// TODO:
public class ๋ฒ ์คํธ์จ๋ฒ {
public static int[] solution(String[] genres, int[] plays) {
List<Integer> list = new ArrayList<>();
int length = genres.length;
Map<String, Integer> map = getSumOfGenres(genres, plays);
Album[] albums = getAlbums(genres, plays, map);
// 1) ์ฌ์ ๋
ธ๋ ํ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ์์ผ๋ก ์ค๋ฆ์ฐจ์
// 2) ์ฌ์๋ ์ฅ๋ฅด ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ์ฌ์ ๋
ธ๋ ํ์ ์ ๋ด๋ฆผ์ฐจ์
// * ์ฌ์๋ ์ฅ๋ฅด ์(์ค๋ฆ์ฐจ์) -> ์ฅ๋ฅด ๋ด์์ ์ฌ์๋ ๋
ธ๋ ํ์(์ค๋ฆ์ฐจ์) -> ๋
ธ๋ ๋ณ ๊ณ ์ ๋ฒํธ(๋ด๋ฆผ์ฐจ์)
Arrays.sort(albums, (i1, i2) -> {
if (i2.sum == i1.sum) {
if (i2.plays == i1.plays) {
return Integer.compare(i1.index, i2.index);
}
return Integer.compare(i2.plays, i1.plays);
}
return Integer.compare(i2.sum, i1.sum);
});
for (int i = 0; i < length; i++) {
System.out.println(albums[i].toString());
}
int count = 1;
list.add(albums[0].index);
for (int i = 1; i < length; i++) {
if (count == 2 && albums[i].genres.equals(albums[i - 1].genres)) {
continue;
}
if (!albums[i].genres.equals(albums[i - 1].genres)) {
count = 0;
}
list.add(albums[i].index);
count ++;
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
private static Album[] getAlbums(String[] genres, int[] plays, Map<String, Integer> map) {
Album[] albums = new Album[genres.length];
for (int i = 0; i < genres.length; i++) {
Album album = new Album(genres[i], plays[i], map.get(genres[i]), i);
albums[i] = album;
}
return albums;
}
private static Map<String, Integer> getSumOfGenres(String[] genres, int[] plays) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
}
return map;
}
static class Album {
String genres;
int plays;
int sum;
int index;
private Album() {
}
public Album(String genres, int plays, int sum, int index) {
this.genres = genres;
this.plays = plays;
this.sum = sum;
this.index = index;
}
@Override
public String toString() {
return "Album{" +
"genres='" + genres + '\'' +
", plays=" + plays +
", sum=" + sum +
", index=" + index +
'}';
}
}
public static void main(String[] args) {
String[] genres = {"c", "a", "b", "a", "a", "b", "b", "b", "b", "c", "c", "c", "d"};
int[] plays = {1, 500, 9, 600, 501, 800, 500, 300, 2, 2, 1, 2, 100000};
int[] result = solution(genres, plays);
System.out.println(Arrays.toString(result));
}
}
ํ์ด
๋ฌธ์ ์์ ๋ ธ๋๋ ๊ณ ์ ๋ฒํธ๋ก ๊ตฌ๋ถํ๋ฉฐ, ๋ ธ๋๋ฅผ ์๋กํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ผ๊ณ ๋ช ์๋์ด ์๋ ๋ถ๋ถ์ด ์ด ๋ฌธ์ ์ ํต์ฌ์ ๋๋ค.
- ์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
- ์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
- ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค.
์ ๊ธฐ์ค์ ๋ฐ๋ผ ์ ๋นํ ์ ๋ ฌ ์กฐ๊ฑด์ ๋ช ์ํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ ์๋์ ๊ฐ์ด ์ ๋ ฌ์ ๊ธฐ๋ํ๊ณ ๋ฌธ์ ๋ฅผ ์ ๊ทผํ๋๋ฐ์,
1) ์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด(sum)๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (๋ด๋ฆผ์ฐจ์)
- ๊ฐ ์ฅ๋ฅด๋ณ ์ด ์ฌ์๋ ํ์๋ฅผ ๊ตฌํฉ๋๋ค.
2) ์ฅ๋ฅด(genres) ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋(plays)๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (๋ด๋ฆผ์ฐจ์)
- 1)์์ ์กฐ๊ฑด์ด ๋์ผํ ๊ฒฝ์ฐ, ๋ง์ด ์ฌ์๋ ๋ ธ๋ ์์ผ๋ก ์ ๋ ฌ์ ํฉ๋๋ค.
3) ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์(plays)๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ(index)๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (์ค๋ฆ์ฐจ์)
- 1)์ด ๋์ผํ๊ณ , 2)์ด ๋์ผํ ๊ฒฝ์ฐ -> ๊ณ ์ ๋ฒํธ(index)๊ฐ ๋ฎ์ ๋ ธ๋ ์์ผ๋ก ์ ๋ ฌ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฅ๋ฅด๋ช ๊ณผ ์ 3๊ฐ์ง๋ฅผ ํ๋๋ก ๊ฐ์ง๋ Album ํด๋์ค๋ฅผ inner class๋ก ์์ฑํฉ๋๋ค.
static class Album {
String genres;
int plays;
int sum;
int index;
private Album() {
}
public Album(String genres, int plays, int sum, int index) {
this.genres = genres;
this.plays = plays;
this.sum = sum;
this.index = index;
}
}
์๋์ ๊ฐ์ด ์ ๋ ฌ์ Album์์ Comparable์ implements ํ ๋ค ๊ตฌํํด๋ ๋์ง๋ง, ์ ๋ ์ต๋ช ํด๋์ค๋ก ๊ตฌํ์ ํ์ต๋๋ค.
static class Album implements Comparable<Album> {
...
@Override
public int compareTo(Album o) {
if (o.sum == this.sum) {
if (o.plays == this.plays) {
return Integer.compare(this.index, o.index);
}
return Integer.compare(o.plays, this.plays);
}
return Integer.compare(o.sum, this.sum);
}
}
๊ทธ ํ ์์์ ์ค๋ช ๋๋ฆฐ 1) ~ 3) ํ์ด์ ๋ํด ๊ฐ๋ตํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1) ์ํ ๋ ธ๋๊ฐ ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (๋ด๋ฆผ์ฐจ์)
- ๊ฐ ์ฅ๋ฅด๋ณ ์ด ์ฌ์๋ ํ์๋ฅผ ๊ตฌํฉ๋๋ค.
์ ๋ Map<String, Integer>์ผ๋ก ์ฅ๋ฅด๋ช ๊ณผ ์ฅ๋ฅด๋ณ ์ด ์ฌ์๋ ํ์๋ฅผ ๊ณ์ฐํ์ต๋๋ค.
Map<String, Integer> map = getSumOfGenres(genres, plays);
private static Map<String, Integer> getSumOfGenres(String[] genres, int[] plays) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
}
return map;
}
2) ์ฅ๋ฅด ๋ด์์ ๋ง์ด ์ฌ์๋ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (๋ด๋ฆผ์ฐจ์)
- 1)์์ ์กฐ๊ฑด์ด ๋์ผํ ๊ฒฝ์ฐ, ๋ง์ด ์ฌ์๋ ๋ ธ๋ ์์ผ๋ก ์ ๋ ฌ์ ํฉ๋๋ค.
3) ์ฅ๋ฅด ๋ด์์ ์ฌ์ ํ์๊ฐ ๊ฐ์ ๋ ธ๋ ์ค์์๋ ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์๋กํฉ๋๋ค. (์ค๋ฆ์ฐจ์)
- 1)์ด ๋์ผํ๊ณ , 2)์ด ๋์ผํ ๊ฒฝ์ฐ -> ๊ณ ์ ๋ฒํธ(index)๊ฐ ๋ฎ์ ๋ ธ๋ ์์ผ๋ก ์ ๋ ฌ์ ํฉ๋๋ค.
์ ๋ฌธ์ ์ ๋ํ ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// 1) ์ฌ์ ๋
ธ๋ ํ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ๊ณ ์ ๋ฒํธ๊ฐ ๋ฎ์ ์์ผ๋ก ์ค๋ฆ์ฐจ์
// 2) ์ฌ์๋ ์ฅ๋ฅด ์๊ฐ ๊ฐ์๊ฒฝ์ฐ => ์ฌ์ ๋
ธ๋ ํ์ ์ ๋ด๋ฆผ์ฐจ์
// * ์ฌ์๋ ์ฅ๋ฅด ์(์ค๋ฆ์ฐจ์) -> ์ฅ๋ฅด ๋ด์์ ์ฌ์๋ ๋
ธ๋ ํ์(์ค๋ฆ์ฐจ์) -> ๋
ธ๋ ๋ณ ๊ณ ์ ๋ฒํธ(๋ด๋ฆผ์ฐจ์)
Arrays.sort(albums, (i1, i2) -> {
if (i2.sum == i1.sum) {
if (i2.plays == i1.plays) {
return Integer.compare(i1.index, i2.index);
}
return Integer.compare(i2.plays, i1.plays);
}
return Integer.compare(i2.sum, i1.sum);
});
๋ง์ง๋ง์ผ๋ก ๋ ธ๋๋ ๋ ๊ฐ์ฉ ๋ชจ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ถ์ํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ์ ํ์ต๋๋ค.
for (int i = 1; i < length; i++) {
if (count == 2 && albums[i].genres.equals(albums[i - 1].genres)) {
continue;
}
if (!albums[i].genres.equals(albums[i - 1].genres)) {
count = 0;
}
list.add(albums[i].index);
count ++;
}
์ฅ๋ฅด๋ ์ต๋ 2๊ฐ๋ง ์ถ์๋ฅผ ํด์ผํ๊ธฐ ๋๋ฌธ์, ์ ์ ์ถ์ํ ์ฅ๋ฅด์ ๋น๊ต๋ฅผ ํฉ๋๋ค.
๋ง์ฝ, 2๊ฐ๋ฅผ ์ถ์ํ๊ณ ๋ค์ ์ถ์ํ๋ ค๋ ์ฅ๋ฅด๊ฐ ์ด์ ์ ์ถ์ํ ์ฅ๋ฅด์ ๋์ผํ ๊ฒฝ์ฐ
- ์ด ๊ฒฝ์ฐ ๋์ด์ ์ถ์๋ฅผ ํ์ง ์๊ณ for๋ฌธ์ ๊ฑด๋๋๋๋ค(continue)
- ex) 'pop', 'pop', 'pop', 'pop'
๋ง์ฝ ์ด์ ์ ์ถ์ํ ์ฅ๋ฅด์ ํ์ฌ ์ถ์ํ ์ฅ๋ฅด๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ
- ํ์ฌ ์ถ์ํ๋ ค๋ ์ฅ๋ฅด๋ฅผ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค[Java] - H-Index(์ ๋ ฌ) (0) | 2020.12.05 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ํคํจ๋ ๋๋ฅด๊ธฐ(2020 ์นด์นด์ค ์ธํด์ญ) (1) | 2020.10.03 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ์ผ๊ฐ ๋ฌํฝ์ด (0) | 2020.09.26 |
[Programmers] - ๋ ๊ฐ ๋ฝ์์ ๋ํ๊ธฐ (0) | 2020.09.20 |
[SW Expert Academy] - (D2)1974. ์ค๋์ฟ ๊ฒ์ฆ (0) | 2020.08.10 |
๋๊ธ