이번 문제는 시간이 정말 오래 걸렸다. 전에 풀어보았던 문제와 비슷하여 딕셔너리를 이용하여 해당 key에 대한 value에 자릿수를 더하고 자릿수 내림차순으로 정렬하여 9부터 1씩 감소시키며 곱한 값을 더하는 방식으로 접근하였다. 그러나 이 문제에서는 첫자리 숫자가 0인 것을 허용하지 않는다는 제한 사항이 있었다. 이를 해결하기 위해 여러가지 방법으로 접근해보았다.
도출된 방법은 첫자리 문자에 대한 체킹을 따로 해주고, J가 첫자리로 들어간 문자열이 하나라도 존재할 때, 자릿수를 보관한 리스트를 역순으로 순회하며 첫자리 수로 사용된 적이 없는 문자가 나오면 그 문자를 리스트에서 삭제해준다. 그리고 9부터 1씩 감소시키며 자릿수와 곱하여 정답 변수에 더해주었다.
이 방법을 생각했을 때 딕셔너리를 다루는 능력이 부족하여 구현에 어려움을 겪었고, 결국은 ord()함수를 이용하여 2차원 리스트를 사용하였다. 이 리스트의 인덱스는 ord()-65로 하여 0부터 A, B, ... , J에 해당하도록 매칭했다. 리스트로 처리하니 한결 구현하기 쉬워졌고 오랜 시간에 걸쳐서 해결할 수 있었다.
match[ord(word[0])-65][0]
에 m을 더한다.match[9][1]
이 True일 경우, 즉 J가 가장 앞에 쓰인 문자열이 있는 경우match[i][1]
이 False일 경우, 즉 해당 문자가 가장 앞에 쓰인 문자열이 없는 경우match[i]
를 지운다.match[i][0]*(9-i)
를 더한다.n = int(input())
match = [[0, False] for _ in range(10)] # A B C ..
answer = 0
for _ in range(n):
word = str(input())
m = 1
match[ord(word[0])-65][1] = True
for c in range(len(word)-1, -1, -1):
match[ord(word[c])-65][0] += m
m *= 10
match.sort(reverse=True)
if match[9][1]:
for i in range(8, -1, -1):
if not match[i][1]:
del match[i]
break
for i in range(9):
answer += match[i][0] * (9-i)
print(answer)