정렬과 Map을 통해 개수를 카운트하여 결과를 도출해냈다.
처음에는 Map이 아닌 List를 통해 거의 동일한 로직으로 구현하였으나
테스트 케이스 28, 33번에서 통과하지 못했었고 해결해보려고 했으나 관련 레퍼런스도 없고(28, 33번의 테스트 케이스를 알면 좋았을텐데...) 하여 다른분들이 풀이한 다른 방법을 보고 Map으로 변경하여 풀이했다...
문제 자체가 간단해서 금방 풀이할 줄 알았으나 List를 활용한 방법에는 누수가 있었던 것 같다. 리스트든 맵이든 메모리 사용량은 거의 똑같았지만(테스트 케이스 별 결과를 눈대중으로 보았을 때 오히려 맵이 조금 더 큰 것 같다) 아쉬움이 남는다 ㅜㅜ
TangerineSelect.java
package com.example.Programmers.Lv2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 프로그래머스 Lv2 - 귤 고르기
*/
public class TangerineSelect {
public int solution(int k, int[] tangerine) {
int answer = 0;
Map<Integer, Integer> tanMap = new HashMap<>();
// 값 초기화(중복값의 경우 +1 업데이트)
for (int tan : tangerine) {
tanMap.put(tan, tanMap.getOrDefault(tan, 0) + 1);
}
// 내림차순 정렬
List<Map.Entry<Integer, Integer>> mapList = new ArrayList<>(tanMap.entrySet());
mapList.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
for (Map.Entry<Integer, Integer> map : mapList) {
answer++;
k -= map.getValue();
if (k <= 0) {
break;
}
}
return answer;
}
}
TangerineSelectTest.java
package com.example.Programmers.Lv2;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class TangerineSelectTest {
@Test
public void testTangerineSelect() {
TangerineSelect ts = new TangerineSelect();
int result1 = ts.solution(6, new int[] { 1, 3, 2, 5, 4, 5, 2, 3 });
int result2 = ts.solution(4, new int[] { 1, 3, 2, 5, 4, 5, 2, 3 });
int result3 = ts.solution(2, new int[] { 1, 1, 1, 1, 2, 2, 2, 3 });
assertEquals(3, result1);
assertEquals(2, result2);
assertEquals(1, result3);
}
}