Leetcode Java Number of Digit One
업데이트:
문제
코드
class Solution {
public int countDigitOne(int n) {
int result = 0;
for (int unit = 1; unit <= n; unit *= 10) {
int quotient = n / unit;
int remainder = n % unit;
result += (((quotient + 8) / 10) * unit) + (quotient % 10 == 1 ? remainder + 1 : 0);
}
return result;
}
}
결과
설명
-
주어진 정수 n 이하의 정수에 포함되는 숫자 1의 개수를 구하는 문제이다.
-
숫자 1이 포함되는 개수를 저장하기 위한 변수 result를 정의하고 0으로 초기화한다.
- 1부터 n 이하의 10의 승수로 반복하여 1의 개수를 산정한다.
- 몫을 저장할 quotient에 $\frac{n}{unit}$의 값을, 나머지를 저장할 remainder에 n을 unit으로 나눈 나머지 값을 넣어준다.
- result에 $(((quotient + 8) / 10) * unit) + (quotient % 10 == 1 ? remainder + 1 : 0)$ 값을 더해준다.
- $((quotient + 8) / 10) * unit$에서 위의 값에서 10을 나눈 값에 unit을 곱하는 이유는, unit의 단위(10의 승수) 별 1의 개수를 산정하기 위한 로직이다.
- $quotient + 8$를 하는 이유는 n이 20 이후의 숫자인 경우, 10 ~ 19까지의 1의 개수인 10개를 보정하기 위한 로직이다.
- $quotient % 10 == 1 ? remainder + 1 : 0$는 11와 같은 특수 행의 경우 1의 개수를 추가 산정하기 위해 $remainder + 1$의 결과를 더해주는 것이다.
- 반복이 완료되면 주어진 정수 n 이하의 정수에 포함되는 숫자 1의 개수를 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기