Leetcode Java Can Make Arithmetic Progression From Sequence
업데이트:
문제
코드
class Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
int length = arr.length;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int num : arr) {
min = Math.min(min, num);
max = Math.max(max, num);
}
int diff = max - min;
if (diff % (length - 1) != 0) {
return false;
}
diff /= length - 1;
for (int i = 0; i < length;) {
int num = arr[i] - min;
if (num == diff * i) {
i++;
} else if (num % diff != 0) {
return false;
} else {
int position = num / diff;
if (position < i || arr[position] == arr[i]) {
return false;
}
int temp = arr[position];
arr[position] = arr[i];
arr[i] = temp;
}
}
return true;
}
}
결과
설명
- arr의 숫자들을 정렬하여 산술 급수를 만들 수 있는지 검증하는 문제이다.
- 두 개 이상의 연속된 숫자의 차이가 동일한 경우, 산술 급수라고 한다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 arr의 길이를 저장한 변수이다.
- min과 max는 arr의 최솟값과 최댓값을 넣을 변수로, arr을 반복하여 최솟값과 최댓값을 넣어준다.
- diff는 max와 min의 차이를 저장한 변수이다.
-
diff를 $length - 1$로 나눈 나머지가 0이 아닌 경우, arr의 모든 값들이 균등하게 증가할 수 없으므로 false를 주어진 문제의 결과로 반환한다.
-
diff에 $length - 1$로 나눈 값인 숫자들 간 차이를 넣어준다.
- i가 0부터 length 미만까지 아래를 수행한다.
- num에 arr의 i번째 값과 min의 차이 값을 넣어준다.
- num이 diff와 i를 곱한 값과 같으면 점층적으로 증가하므로 i를 증가시켜준다.
- 위가 경우가 아니면서 num을 diff로 나눈 나머지가 0이 아닌 경우, 증가하는 값이 다르므로 false를 주어진 문제의 결과로 반환한다.
- 위의 경우가 아니면 아래를 수행한다.
- position에 $\frac{num}{diff}$을 넣어준다.
- position이 i보다 작거나 arr의 i번째 값과 position번째 값이 동일하면, 증가하는 경우가 아니므로 false를 주어진 문제의 결과로 반환한다.
- arr의 i번째 값과 position번째 값을 바꾸어준다.
- 반복이 정상적으로 종료되면 arr의 값들로 산술 급수를 만들 수 있으므로, true를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기