Leetcode Java Non-negative Integers without Consecutive Ones
업데이트:
문제
코드
class Solution {
public int findIntegers(int n) {
int[] dp = new int[32];
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i < dp.length; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
int sum = 0;
int pre = 0;
for (int idx = 30; idx >= 0; idx--) {
if ((n & (1 << idx)) != 0) {
sum += dp[idx];
if (pre == 1) {
sum--;
break;
}
pre = 1;
} else {
pre = 0;
}
}
return sum + 1;
}
}
결과
설명
-
양의 정수 n이 주어지면 [0, n] 범위의 정수 중 이진수로 변환했을 때 1이 연속되지 않은 정수의 개수를 반환하는 문제이다.
-
dp를 정수 최대 길이인 32 크기로 초기화 하고, 1과 2를 차례대로 넣어준 후 피보나치 수열을 이용하여 dp를 초기화한다.
-
정수의 개수를 넣을 sum와 이전 자리의 이진수의 값을 저장할 pre를 0으로 초기화한다.
- 30부터 0 이상까지 idx를 감소시키며 아래를 반복한다.
- n과 1을 idx번 이동시킨 값의 결과가 0이 아닌 경우, 아래를 수행한다.
- sum에 dp의 idx번째 값을 더해 문제의 조건을 만족하는 정수의 개수를 증가시켜준다.
- pre가 1인 경우, 연속된 1이 발생했으므로 sum을 감소시키고 반복을 중지한다.
- 위의 경우가 아닌 경우, pre에 0을 넣고 반복을 계속 수행한다.
- n과 1을 idx번 이동시킨 값의 결과가 0이 아닌 경우, 아래를 수행한다.
- 반복이 완료되면 [1, n] 범위의 정수 중 이진수로 변환했을 때 1이 연속되지 않은 정수의 개수인 sum에 0인 경우를 추가한 $sum + 1$을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기