Codility Java EquiLeader
업데이트:
문제
코드
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
import java.util.Map;
import java.util.HashMap;
import java.util.Vector;
class Solution {
public int solution(int[] A) {
Vector<Integer> record = getRecord(A);
int result = 0;
for (int idx = 0; idx < A.length; idx++) {
int left = record.elementAt(idx);
int right = record.lastElement() - left;
int equiOne = ((idx + 1) / 2) + 1;
int equiTwo = ((A.length - (idx + 1)) / 2) + 1;
if ((left >= equiOne) && (right >= equiTwo)) {
result++;
}
}
return result;
}
private Vector<Integer> getRecord(int[] A) {
Vector<Integer> record = new Vector<>();
int leader = getLeader(A);
int count = 0;
for (int num : A) {
if (num == leader) {
count++;
}
record.add(count);
}
return record;
}
private int getLeader(int[] A) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : A) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int leader = 0;
int max = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > max) {
leader = entry.getKey();
max = entry.getValue();
}
}
return leader;
}
}
설명
- 주어진 배열 A에 들어간 숫자가 몇 번 반복되었는지를 계산하기 위해 Map을 사용한다.
- 주어진 배열 A를 반복하여 변수 map에 숫자를 key로 반복 횟수를 value로 증가시켜준다.
- 변수 map에서 가장 많이 반복된 숫자를 가져온다.
- 리더의 변화를 탐색하기 위해 Vector를 정의하고, 주어진 배열 A를 반복하여 index 별 리더의 수를 계산한다.
- 계산된 record 기반으로 이분법을 적용하여 동등한 리더의 수를 계산하여 주어진 문제의 결과로 반환한다.
- 좌측의 리더의 수인 변수 left와 우측의 리더의 수인 right를 계산한다.
- 동등한 리더가 되기 위해서는 위치 기반으로 절반 이상의 리더가 존재해야 한다.
- 절반 이사의 리더가 존재하는 경우만 동등한 리더의 수를 계산하는 변수 result를 증가시킨다.
결과
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기