Leetcode Java Number of Squareful Arrays
업데이트:
문제
코드
class Solution {
public int numSquarefulPerms(int[] nums) {
return this.dfs(nums, 0);
}
private int dfs(int[] nums, int index) {
if (index >= nums.length) {
return 1;
}
int sum = 0;
for (int i = index; i < nums.length; i++) {
if (!this.isSwapable(nums, index, i)) {
continue;
}
this.swap(nums, index, i);
if (index == 0 || this.isSquareful(nums, index)) {
sum += this.dfs(nums, index + 1);
}
this.swap(nums, index, i);
}
return sum;
}
private boolean isSwapable(int[] nums, int i, int j) {
while (i < j) {
if (nums[i++] == nums[j]) {
return false;
}
}
return true;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private boolean isSquareful(int[] nums, int idx) {
int sqrt = (int) Math.sqrt(nums[idx] + nums[idx - 1]);
return (sqrt * sqrt) == (nums[idx] + nums[idx - 1]);
}
}
결과
설명
- nums의 좌우 값의 합이 완전 제곱이 되도록 정렬 가능한 경우의 수를 반환하는 문제이다.
- 완전 제곱은 한 정수에 대한 제곱 값에 해당하는 경우를 의미한다.
-
3번에서 정의한 dfs(int[] nums, int index) 메서드의 index에 0을 넣어 수행한 결과를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 검증할 dfs(int[] nums, int index) 메서드를 정의한다.
- index가 nums의 길이 이상인 경우, 다음 검증이 불가능하므로 1을 반환한다.
- sum은 경우의 수를 더할 변수로, 0으로 초기화한다.
- index부터 nums의 길이 미만까지 i를 증가시켜 아래를 반복한다.
- 동일한 수가 이어져 스왑이 필요 없는 경우, 다음 반복을 수행한다.
- nums의 index번째 값과 i번째 값을 스왑해준다.
- index가 0이거나 완전 제곱을 만족하는 경우, sum에 $index + 1$로 재귀 호출을 수행한 결과를 더해준다.
- 위의 수행이 완료되면 nums의 index번째 값과 i번째 값을 스왑하여 원복해준다.
- 반복이 완료되면 sum을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기