Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 6444 스프레드시트

정글러 2021. 11. 25. 16:10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**8)
 
alph = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
digit = list('0123456789')
 
dic = {}
for i in range(26) : 
    dic[alph[i]] = i + 1
for i in range(26) : 
    for j in range(26) : 
        dic[alph[i] + alph[j]] = (i + 1* 26 + j + 1
for i in range(26) : 
    for j in range(26) : 
        for k in range(26) : 
            dic[alph[i] + alph[j] + alph[k]] = (i + 1* 26 * 26 + (j + 1* 26 + k + 1
 
def transRC(inp) : 
    if len(inp) > 2 and inp[2not in digit : 
        col = dic[inp[:3]]
        row = int(inp[3:])
    elif inp[1not in digit : 
        col = dic[inp[:2]]
        row = int(inp[2:])
    else : 
        col = dic[inp[0]]
        row = int(inp[1:])
    return [row, col]
 
def translation(inp) : 
    if inp[0== '=' : 
        calbox = inp[1:].split('+')
        for i in range(len(calbox)) : 
            calbox[i] = transRC(calbox[i])
        return calbox
    else : 
        return int(inp)
 
testcase = int(input())
for t in range(testcase) : 
    Cn, Rn = map(int, input().split())
    T = [[None]]
    for i in range(Rn) : 
        T.append([None+ list(input().split()))
 
    def DFS(r, c) : 
        tr = translation(T[r][c])
        if type(tr) is int : 
            T[r][c] = tr
        else : 
            sum = 0
            for row, col in tr : 
                if type(T[row][col]) is not int : 
                    DFS(row, col)
                sum = sum + T[row][col]
            T[r][c] = sum
 
    for i in range(1, Rn + 1) : 
        for j in range(1, Cn + 1) : 
            if type(T[i][j]) is not int : 
                DFS(i, j)
    for i in range(1, Rn + 1) : 
        print(*T[i][1:])
cs

line 5 ~ 17

열 번호 A부터 ZZZ까지를 숫자로 바꿔주는 dict를 만든다.

 

line 19 ~ 29

블럭의 좌표로 입력된 문자열(ex : ZF12)을 row와 col의 좌표로 바꿔주는 함수 transRC를 정의한다.

문자열의 [2]가 알파벳이라면 앞 세자리가 col이고 [3]부터는 숫자일 것이므로 이를 변환하여 리턴한다.

[2]가 알파벳이 아니라면 [1]이 알파벳인지 확인한다.

알파벳이라면 앞 두자리, 아니라면 첫자만 col이므로 이를 변환하여 리턴한다.

 

line 31 ~ 38

입력된 문자열이 숫자면 int를, 수식이면 리스트를 리턴하는 함수 translation을 정의한다.

'='로 시작하는 수식이 주어지면 이를 더해야할 좌표값을의 리스트로 변환한다.

'+'를 기준으로 스플릿해서 좌표를 나타내는 문자열을 따고, 각 문자열에 대해 transRC를 실행하여 r, c를 받는다.

 

line 40 ~ 64

모든 좌표에 대해 translation을 실행하여 값을 int로 바꿔준다.

translation의 결과가 리스트라면 리스트의 원소인 좌표에 대해 재귀하는 함수 DFS를 정의한다.

후위 순회로 list의 sum을 취하면, DFS가 실행되어 값이 int로 바뀐 list의 원소들을 더할 수 있다.

이것이 수식의 계산 결과이므로 좌표에 값을 기록한다.

모든 좌표를 for문으로 돌며 아직 값이 int로 바뀌지 않은 점이 있다면 DFS를 실행한다.

그 후 답을 출력한다.