Leetcode Java Maximum Equal Frequency
업데이트:
문제
코드
class Solution {
public int maxEqualFreq(int[] nums) {
int[] counts = new int[100001];
int[] frequencies = new int[100001];
int length = nums.length;
int result = 0;
for (int i = 0; i < length; i++) {
counts[nums[i]]++;
int frequency = counts[nums[i]];
frequencies[frequency]++;
int count = frequencies[frequency] * frequency;
if (count == i + 1 && i != length - 1) {
result = Math.max(result, i + 2);
} else if (count == i) {
result = Math.max(result, i + 1);
}
}
return result;
}
}
결과
설명
-
양의 정수가 들어있는 배열인 nums의 부분 배열 중 한 값을 제거하여 동일한 값이 정확히 같은 횟수로 반복되는 부분 배열의 최대 길이를 반환하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- counts와 frequencies는 문자 갯수와 빈도를 계산하기 위한 변수로, 각각 최대 크기인 $10^5$ 보다 1 큰 크기의 정수 배열로 초기화한다.
- length는 nums의 길이를 저장한 변수이다.
- result는 부분 배열의 길이를 저장한 변수로, 0으로 초기화한다.
- 0부터 length 미만까지 i를 증가시키며 아래를 반복한다.
- counts[nums[i]]의 값인 nums[i]번째 문자 갯수를 증가시킨다.
- frequency는 현재 발생 빈도 기준을 저장할 변수로, counts[nums[i]]의 값을 넣어준다.
- frequencies[frequency]의 값을 증가시켜 현재까지 문자 발생 빈도의 갯수를 증가시켜준다.
- count는 현재 발생 빈도만큼의 문자열이 동일하게 발생한 경우, 문자의 갯수를 저장한 변수이다.
- count가 $i + 1$과 동일하면서 $length - 1$인 마지막 위치가 아닌 경우, result에 result와 $i + 2$인 현재까지 부분 문자열 길이보다 1 큰 값 중 큰 값을 넣어준다.
- nums의 값이 [1, 1, 3, 3, 5] 인 경우, 전체를 부분 배열로 하면 조건을 만족하는 1과 3이 존재하면서 제거할 5가 있으므로 count가 $i + 1$과 동일하다.
- i는 0-index이므로 길이는 1을 더한 값이다.
- 위의 경우가 아니면서 count가 i와 동일한 경우, result에 result와 $i + 1$ 중 큰 값을 넣어준다.
- nums의 값이 [1, 1, 3, 3, 3, 5] 인 경우, 조건을 만족하는 범위인 [1, 1, 3, 3, 3]인 부분 배열에서 3만 제거하면 되므로 count가 i와 동일하다.
- 반복이 완료되면 부분 배열의 최대 길이가 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기