Skip to content

Commit 10576a7

Browse files
authored
Create 679. 24 Game.py
1 parent 8a92c3f commit 10576a7

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#
2+
3+
'''
4+
1. 아이디어 :
5+
숫자 4개 중 2개를 골라 +, -, *, / 연산 결과를 만든다.
6+
선택한 두 숫자를 제거하고, 연산 결과를 넣어 DFS를 반복한다.
7+
숫자가 1개 남았을 때 값이 24에 가까우면 True, 아니면 False를 반환한다.
8+
9+
2. 시간복잡도 :
10+
O(6ⁿ · n! · n!)
11+
12+
3. 자료구조/알고리즘 :
13+
dfs
14+
15+
'''
16+
class Solution:
17+
def judgePoint24(self, cards: List[int]) -> bool:
18+
EPSILON = 1e-6
19+
20+
def dfs(nums: List[float]) -> bool:
21+
# 모든 연산이 끝난 경우
22+
if len(nums) == 1:
23+
return abs(nums[0] - 24) < EPSILON
24+
25+
n = len(nums)
26+
27+
# 서로 다른 숫자 2개 선택
28+
for i in range(n):
29+
for j in range(i + 1, n):
30+
a = nums[i]
31+
b = nums[j]
32+
33+
# 선택하지 않은 숫자들
34+
remaining = [
35+
nums[k]
36+
for k in range(n)
37+
if k != i and k != j
38+
]
39+
40+
# a와 b로 만들 수 있는 결과
41+
candidates = [
42+
a + b,
43+
a - b,
44+
b - a,
45+
a * b,
46+
]
47+
48+
# 0으로 나누는 경우 제외
49+
if abs(b) > EPSILON:
50+
candidates.append(a / b)
51+
52+
if abs(a) > EPSILON:
53+
candidates.append(b / a)
54+
55+
for result in candidates:
56+
remaining.append(result)
57+
58+
if dfs(remaining):
59+
return True
60+
61+
remaining.pop()
62+
63+
return False
64+
65+
return dfs([float(card) for card in cards])

0 commit comments

Comments
 (0)