Leetcode Java Count Good Numbers
업데이트:
문제
코드
class Solution {
private static final int MOD = 1000000007;
public int countGoodNumbers(long n) {
return (int) (this.pow(5, (n + 1) / 2) * this.pow(4, n / 2) % MOD);
}
public long pow(long x, long y) {
if (y == 0) {
return 1;
} else {
long temp = this.pow(x, y / 2);
if (y % 2 == 0) {
return (temp * temp) % MOD;
} else {
return (x * temp * temp) % MOD;
}
}
}
}
결과
설명
- n 길이의 숫자들 중 아래의 규칙을 만족하는 좋은 숫자의 갯수를 세는 문제이다.
- 좋은 숫자는 짝수 위치의 값은 짝수이고, 홀수 위치의 값은 소수인 값이다.
- n 길이의 숫자 앞 자리에 0이 포함하여 조건을 만족할 수 있다.
- 조건을 만족하는 숫자의 갯수가 매우 많을 수 있으므로, 모듈러 $10^9 + 7$를 적용하여 반환한다.
- 조건을 만족하는 제곱을 계산하기 위한 pow(long x, long y) 메서드를 정의한다.
- y가 0인 승수가 0이면, 1을 반환한다.
- y가 0이 아닌 경우, 아래를 수행한다.
- temp에 x와 $\frac{y}{2}$로 재귀 호출 수행한 결과를 넣어준다.
- y가 짝수인 경우, $\frac{temp \times temp}{MOD}$를 반환한다.
- y가 홀수인 경우, $\frac{x \times temp \times temp}{MOD}$를 반환한다.
- 주어진 조건의 결과로 2번의 pow(long x, long y) 메서드에 5와 $\frac{n + 1}{2}$를 수행한 결과와 4와 $frac{n}{2}$를 수행한 결과의 곱을 주어진 문제의 결과로 반환한다.
해설
- 짝수 자리는 짝수인 0, 2, 4, 6, 8 값의 갯수인 5개가, 홀수 자리는 소수인 2, 3, 5, 7 값의 갯수인 4개가 존재한다.
- 좋은 숫자의 총 갯수는 아래의 두 경우의 수에 대한 곱이 되며, 각 계산에 모듈러 $10^9 + 7$을 적용해야 한다.
- 짝수의 5개에 짝수 인덱스 갯수의 제곱.
- 소수의 4개에 소수 인덱스 갯수의 제곱.
- 제곱 계산은 승수가 짝수인 경우와 홀수인 경우에 대해서 아래와 같이 계산이 가능하다.
- y가 짝수인 경우, $x^y = x^\frac{y}{2} \times x^\frac{y}{2}$로 표현 가능하다. 예를 들어, $x^4 = x^2 \times x^2$와 같다.
- y가 홀수인 경우, $x^y = x \times x^\frac{y}{2} \times x^\frac{y}{2}$로 표현 가능하다. 예를 들어, $x^5 = x \times x^2 \times x^2$와 같다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기