Leetcode Java Additive Number
업데이트:
문제
코드
class Solution {
public boolean isAdditiveNumber(String num) {
return this.recursive(num, -1, -1, 0, 0);
}
private boolean recursive(String num, long pre, long cur, int idx, int cnt) {
int length = num.length();
if (idx == length) {
if (cur != -1 && pre != -1 && cnt > 2) {
return true;
} else {
return false;
}
}
long n = 0;
for (int i = idx; i < length; i++) {
n = n * 10 + (num.charAt(i) - '0');
if (cur != -1 && pre != -1) {
if (n == cur + pre) {
if (this.recursive(num, cur, n, i + 1, cnt + 1)) {
return true;
}
} else if (n > cur + pre) {
return false;
}
}
if (pre == -1) {
if (this.recursive(num, n, cur, i + 1, cnt + 1)) {
return true;
}
} else if (cur == -1) {
if (this.recursive(num, pre, n, i + 1, cnt + 1)) {
return true;
}
}
if (n == 0) {
break;
}
}
return false;
}
}
결과
설명
-
숫자로 이루어진 주어진 문자열 num을 이용하여 숫자를 나눌 때, 이전 값과 현재 값의 합이 다음 값이 되는 조합으로 이루어져 있는지 검증하는 문제이다.
- 문제 풀이에 사용할 재귀 호출 메서드인 recursive를 정의한다.
- 이전 값을 pre, 현재 값을 cur, 문자열의 위치 값인 idx, 숫자열의 개수를 저장할 cnt 변수로 활용한다.
-
length에 num의 길이를 저장한다.
- idx가 length와 동일한 경우, 아래를 검증한다.
- cur과 pre가 -1이 아니고 cnt가 2보다 큰 경우 최소한 세 개 이상의 숫자열이 이전 값과 현재 값의 합이 다음 값이 되므로, true를 반환한다.
- 그렇지 않은 경우 문제를 충족하지 않으므로, false를 반환한다.
- 값을 측정할 변수 n을 정의하고, idx부터 length까지 반복을 수행한다.
- n에 $n \times 10$에 num의 i번째 문자열의 숫자 값을 더해준다.
- cur과 pre가 -1인 경우, 아래를 검증한다.
- n의 값이 $cur + pre$의 값과 동일한 경우, pre 자리에 cur을, cur 값에 n을, i 값에 $i + 1$을, cnt 값에 $cnt + 1$을 넣어 재귀 호출을 수행한 결과가 true인 경우 true를 반환한다.
- n의 값이 $cur + pre$의 값보다 큰 경우, false를 반환한다.
- pre가 -1인 경우, 첫 검증을 수행하므로 아래를 수행한다.
- pre 자리에 n을, cur 값에 cur을, i 값에 $i + 1$을, cnt 값에 $cnt + 1$을 넣어 재귀 호출을 수행한 결과가 true인 경우, true를 반환한다.
- pre가 -1이 아니고 cur이 -1인 경우, 아래를 수행한다.
- pre 자리에 pre를, cur 값에 n을, i 값에 $i + 1$을, cnt 값에 $cnt + 1$을 넣어 재귀 호출을 수행한 결과가 true인 경우, true를 반환한다.
- n이 0인 경우 유효하지 않는 값이므로, 반복을 멈추고 false를 반환한다.
- Note에 추가로 설명한 1, 02, 3 혹은 1, 2, 03 같이 0이 붙는 경우 유효하지 않는 값으로 판단한다.
- 위에서 정의한 재귀 호출 메서드인 recursive를 pre와 cur에 -1을, idx와 cnt에 0을 넣어 num을 검증한 결과를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기