Leetcode Java 24 Game
업데이트:
문제
코드
class Solution {
public boolean judgePoint24(int[] cards) {
return this.dfs(new double[] { cards[0], cards[1], cards[2], cards[3] });
}
private boolean dfs(double[] cards) {
int length = cards.length;
if (length == 1) {
return Math.abs(cards[0] - 24) < 0.001;
}
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
double[] temp = new double[length - 1];
for (int k = 0, index = 0; k < length; k++) {
if (k != i && k != j) {
temp[index++] = cards[k];
}
}
for (double d : this.compute(cards[i], cards[j])) {
temp[temp.length - 1] = d;
if (this.dfs(temp)) {
return true;
}
}
}
}
return false;
}
private double[] compute(double a, double b) {
return new double[] { a + b, a - b, b - a, a * b, a / b, b / a };
}
}
결과
설명
-
4개의 정수가 들어 있는 cards를 이용하여 ‘+’, ‘-‘, ‘*’, ‘/’ 연산자와 소괄호 ‘(‘, ‘)’ 문자를 이용하여 24를 만드는 문제이다.
-
cards를 실수 배열로 변환하여 3번에서 정의한 dfs(double[] cards) 메서드를 수행한 결과를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 cards를 이용하여 24를 만들 수 있는지 여부를 검증하기 위한 dfs(double[] cards) 메서드를 정의한다.
- length에 cards의 길이를 저장한다.
- length가 1인 경우, $cards[0] - 24$가 0이 아닌 작은 수인 0.001보다 작은지 여부를 반환한다.
- 0부터 length 미만까지 i를 증가하고, $i + 1$부터 length 미만까지 j를 증가시키며 아래를 수행한다.
- temp는 임시 검증 값을 담을 배열로, $length - 1$ 크기의 실수 배열로 초기화한다.
- index를 0으로 정의하고, 0부터 length 미만까지 k를 증가시키며 k가 i나 j가 아닌 값일 경우, temp[index]에 cards[k]를 계속 넣어준다.
- 4번에서 정의한 compute(double a, double b) 메서드의 수행 결과를 이용한 결과를 각각 d에 넣어 반복하여, temp의 마지막 위치에 d를 넣고 temp로 재귀 호출을 수행한 결과가 true인 경우 true를 반환한다.
- 반복이 완료되면 24를 만들 수 없으므로, false를 반환한다.
- a와 b를 이용하여 각 연산의 결과를 넣을 compute(double a, double b) 메서드를 정의한다.
- a와 b를 ‘+’, ‘-‘, ‘*’, ‘/’ 연산자에 대입하여 나오는 모든 경우의 수를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기