[HackerRank] Luck Balance

아르당·2024년 5월 10일
0

HackerRank

목록 보기
86/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

레나는 연속적인 예선이 있는 중요한 코딩 대회를 준비하고 있다. 처음에 그녀의 행운의 균형은 0이다. 그녀는 "행운을 저장하는 것"을 믿고, 그녀의 이론을 확인하는 것을 원한다. 각 대회는 두 개의 정수, L[i]와 T[i]로 설명된다.

  • L[i]는 대회와 관련된 운의 양이다. 만약 레나가 대회에서 우승한다면, 그녀의 행운 균형은 L[i]만큼 감소될 것이다. 만약 그녀가 대회에서 지면, 그녀의 행운 균형은 L[i]만큼 증가할 것이다.
  • T[i] 는 대회의 중요성 등급을 나타낸다. 등급이 1이면 중요한 대회이고, 등급이 0이면, 중요하지 않다.

만약 레나가 중요한 대회를 최대 k번까지만 지면, 모든 예선 대회에 참가한 후 가질 수 있는 최대 행운의 양은 얼마인가? 이 값은 음수일 수도 있다.

Example

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이 될 것이다.

Function Description

luckBalance 함수를 완성해라.
luckBalance 함수는 아래와 같은 매개변수를 가지고 있다.

  • int k: 중요한 대회에서 레나가 질 수 있는 수
  • int contests[n][2]: 정수형 2차원 배열. 각 contests[i]는 두 개의 정수를 가지고 있고, i번 째 대회의 중요도와 행운 균형을 나타낸다.

Returns

  • int: 성취할 수 있는 행운 균형의 최대값

Constraints

  • 1 <= n <= 100
  • 0 <= k < N
  • 1 <= L[i] <= 10^4
  • T[i] ∈ {0, 1}

Solved

문제에서 따로 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;

All code

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;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글