Excel 스프레드시트를 나타내는 2D 행렬이 있다고 가정합니다. 모든 셀과 수식이 계산된 동일한 행렬을 찾아야 합니다. 엑셀 스프레드시트는 아래와 같습니다.
B1 | 7 | 0 |
3 | 5 | =A1+A2 |
열의 이름은 (A, B, C...)이고 행은 (1, 2, 3....)입니다. 각 셀에는 avalue, 다른 셀에 대한 참조 또는 다음 작업을 위한 Excel 수식이 포함됩니다. 숫자 사이 또는 셀 참조. (예:"=A1+5", "=A2+B2" 또는 "=2+5")
따라서 입력이 다음과 같으면
B1 | 7 | 0 |
3 | 5 | =A1+A2 |
그러면 출력은
7 | 7 | 0 |
3 | 5 | 10 |
B1 =7(첫 번째 행 두 번째 열) 및 "=A1 + A2"는 7 + 3 =10입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
resolve() 함수를 정의합니다. 시간이 걸립니다
-
s가 숫자이면 s를 정수로 반환
-
그렇지 않으면 solve(getIdx(s))
를 반환합니다. -
함수 getIdx() 를 정의하십시오. 시간이 걸립니다
-
첫 번째 값이 정수로 1부터 끝까지 s의 부분 문자열이고 두 번째 값이 s[0]의 ASCII - "A"의 ASCII인 목록을 반환합니다.
-
함수 do() 를 정의합니다. 이것은, b, op
가 걸립니다. -
op가 "+"와 같으면
-
+ b를 반환
-
-
op가 "-"와 같으면
-
반환 - b
-
-
op가 "*"와 같으면
-
반환 * b
-
-
op가 "/"와 같으면
-
/ b를 반환
-
-
solve() 함수를 정의합니다. 이것은 i, j가 걸릴 것입니다
-
행렬[i,j]가 숫자이면 해당 값을 반환합니다.
-
그렇지 않으면:
-
s :=행렬[i, j]
-
s[0]이 "="와 같으면
-
s[인덱스 2에서 끝까지]의 부분 문자열에 있는 각 c에 대해
-
c가 (+, -, /, *)의 연산자이면
-
op :=c
-
루프에서 나오다
-
-
-
[a, b] :=s의 부분 문자열 [인덱스 1에서 끝까지] 및 op로 분할
-
[aRes, bRes] :=[resolve(a) , resolve(b)]
-
do(aRes, bRes, op) 반환
-
-
그렇지 않으면
-
해결 반환(getIdx(s))
-
-
-
행렬의 행 수까지 범위 0에 있는 i에 대해
-
행렬의 열 개수까지 범위 0의 j에 대해
-
matrix[i, j] :=(solve(i, j)) 문자열로
-
-
-
반환 행렬
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예시
class 솔루션:def solve(self, matrix):def resolve(s):try:return int(s) 제외:return solve(*getIdx(s)) def getIdx(s):return [int(s[ 1:]) - 1, ord(s[0]) - ord("A")] def do(a, b, op):op =="+"인 경우:op =="-인 경우 a + b를 반환합니다. ":return a - b if op =="*":return a * b if op =="/":return a / b def solve(i, j):try:return int(matrix[i][j] ) 제외: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)):범위 내 j에 대해(len(matrix[0])):matrix[i][j] =str(solve(i, j)) return matrixob =솔루션() 행렬 =[ ["B1", "7", "0"], ["3", "5", "=A1+A2"]]print(ob.solve(matrix))사전>입력
[["B1", "7", "0"],["3", "5", "=A1+A2"] ]출력
[['7', '7', '0'],['3', '5', '10']]