문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
레나는 연속적인 예선이 있는 중요한 코딩 대회를 준비하고 있다. 처음에 그녀의 행운의 균형은 0이다. 그녀는 "행운을 저장하는 것"을 믿고, 그녀의 이론을 확인하는 것을 원한다. 각 대회는 두 개의 정수, L[i]와 T[i]로 설명된다.
만약 레나가 중요한 대회를 최대 k번까지만 지면, 모든 예선 대회에 참가한 후 가질 수 있는 최대 행운의 양은 얼마인가? 이 값은 음수일 수도 있다.
k = 2
L = [5, 1, 4]
T = [1, 1, 0]
만약 레나가 모든 대회에서 진다면, 그녀는 5 + 1 + 4 = 10이 될 것이다. 그녀가 중요한 대회를 2번까지 질 수 있고, 중요한 대회는 2개뿐이므로, 그녀는 세 개의 모든 대회를 질 수 있어서 그녀의 행운은 10이 된다.
만약 k = 1이면, 그녀는 2개의 중요한 대회에서 적어도 1개를 이겨야 한다. 그녀는 가장 값이 낮은 1인 중요한 대회를 이기기로 선택할 것이다. 그녀의 최종 행운은 5 + 4 - 1 = 8이 될 것이다.
luckBalance 함수를 완성해라.
luckBalance 함수는 아래와 같은 매개변수를 가지고 있다.
문제에서 따로 contest의 순서에 대해 언급이 없어서 정렬를 해서 문제를 풀었다. 2차원 배열이라서 기존에 1차원 배열로 정렬할 수 없어서 커스텀을 해줘야 한다.
먼저 contests를 정렬한다. 이때 합을 쉽게 구하기 위해 모든 것을 내림차순으로 정렬한다.
contests.sort(new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
if(o1.get(1) != o2.get(1)){
return o2.get(1) - o1.get(1);
}else{
return o2.get(0) - o1.get(0);
}
}
});
이제 정수 result를 선언하고 0을 할당한다. result는 합을 구하고 반환할때 사용한다.
int result = 0;
for문을 사용해서 contests를 전부 순회한다. 내림차순으로 정렬했기 때문에 k가 i보다 작거나 같고 중요도가 1이면 빼주고, 그 외는 더하면 된다.
for(int i = 0; i < contests.size(); i++){
if(k <= i && contests.get(i).get(1) == 1){
result -= contests.get(i).get(0);
}else{
result += contests.get(i).get(0);
}
}
마지막으로 result를 반환한다.
return result;
public static int luckBalance(int k, List<List<Integer>> contests) {
contests.sort(new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
if(o1.get(1) != o2.get(1)){
return o2.get(1) - o1.get(1);
}else{
return o2.get(0) - o1.get(0);
}
}
});
int result = 0;
for(int i = 0; i < contests.size(); i++){
if(k <= i && contests.get(i).get(1) == 1){
result -= contests.get(i).get(0);
}else{
result += contests.get(i).get(0);
}
}
return result;
}