Leetcode Java Beautiful Array
업데이트:
문제
코드
class Solution {
public int[] beautifulArray(int n) {
return this.dfs(new HashMap<>(), n);
}
private int[] dfs(Map<Integer, int[]> map, int n) {
if (map.containsKey(n)) {
return map.get(n);
} else {
int[] result = new int[n];
if (n == 1) {
result[0] = 1;
} else {
int index = 0;
for (int num : this.dfs(map, (n + 1) / 2)) {
result[index++] = (2 * num) - 1;
}
for (int num : this.dfs(map, n / 2)) {
result[index++] = 2 * num;
}
}
map.put(n, result);
return result;
}
}
}
결과
설명
- 아래의 규칙을 만족하는 n 길이인 임의의 아름다운 배열인 nums를 만드는 문제이다.
- nums는 [1, n] 범위의 정수로 이루어진 배열이다.
- 0 <= i < j < n일때, $2 \times nums[k] = nums[i] + nums[j]$를 만족하는 i < k < j인 k가 존재하지 않는다.
-
3번에서 정의한 dfs(Map<Integer, int[]> map, int n) 메서드를 수행한 결과를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 아름다운 배열을 만들기 위한 dfs(Map<Integer, int[]> map, int n) 메서드를 정의한다.
- map에 키가 n인 배열이 존재하면 해당 배열을 반환한다.
- 위가 아니라면 result에 n 크기의 배열을 만들어준다.
- n이 1인 경우, result의 첫 위치에 1을 넣어준다.
- n이 1이 아니면 아래를 수행한다.
- index는 result의 위치 값을 저장할 변수로, 0으로 초기화한다.
- n의 위치에 $\frac{n + 1}{2}$을 넣고 재귀 호출을 수행한 결과의 모든 값을 num에 넣고, result의 index번째 위치에 $(2 \times num) - 1$을 넣고 index를 증가시켜 앞 부분에 아름다운 배열이 되기 위한 조건의 값을 넣어준다.
- n의 위치에 $\frac{n}{2}$을 넣고 재귀 호출을 수행한 결과의 모든 값을 num에 넣고, result의 index번째 위치에 $2 \times num$을 넣고 index를 증가시켜 뒷 부분에 아름다운 배열이 되기 위한 조건의 값을 넣어준다.
- map의 n에 해당하는 값에 result를 넣고 result를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기