มีเมทริกซ์ 2 มิติแทน Spreadsheet เซลล์อาจเป็นค่า ตำแหน่งอ้างอิงหรือสูตร (ขึ้นต้นด้วย =) ต้องคำนวณให้ได้ค่าจริงทั้งเมทริกซ์
ตัวอย่าง:
| B1 | 7 | 0 |
| 3 | 5 | =A1+A2 |
| 7 | 7 | 0 |
| 3 | 5 | 10 |
แนวทาง (Recursive Evaluation with Memoization)
resolve(s): แปลงสตริงเป็นค่า (ถ้าเป็นตัวเลขคืนเลข, ถ้าเป็น reference เรียก solve)getIdx(s): แปลง "A1" → [0, 0] (row, col)do(a, b, op): คำนวณ + - * /solve(i, j): คำนวณเซลล์ (i,j) แบบ recursive
ตัวอย่างโค้ด
class Solution:
def solve(self, matrix):
def resolve(s):
try:
return int(s)
except:
return solve(*getIdx(s))
def getIdx(s):
return [int(s[1:]) - 1, ord(s[0]) - ord("A")]
def do(a, b, op):
if op == "+": return a + b
if op == "-": return a - b
if op == "*": return a * b
if op == "/": return a / b
def solve(i, j):
try:
return int(matrix[i][j])
except:
s = matrix[i][j]
if s[0] == "=":
for c in s[2:]:
if c in "+-*/":
op = c
break
a, b = s[1:].split(op)
aRes, bRes = resolve(a), resolve(b)
return do(aRes, bRes, op)
else:
return solve(*getIdx(s))
for i in range(len(matrix)):
for j in range(len(matrix[0])):
matrix[i][j] = str(solve(i, j))
return matrix
ob = Solution()
matrix = [["B1", "7", "0"], ["3", "5", "=A1+A2"]]
print(ob.solve(matrix))
# [['7', '7', '0'], ['3', '5', '10']]
อินพุต
[["B1", "7", "0"], ["3", "5", "=A1+A2"]]
เอาต์พุต
[['7', '7', '0'], ['3', '5', '10']]