728x90
문제 보기
[사용한 알고리즘]
그리디
[문제 접근]
주어진 단어들의 각 알파벳들의 가치를 계산한 후에 숫자를 대입하고자 하였습니다.
[알고리즘]
1. 알파벳의 가치를 계산합니다. 예를 들어서 1의 자리 숫자이면 + 1, 10의 자리 숫자이면 + 10을 더해 각 알파벳들의 가치를 정수로 표현합니다.
2. 가치가 가장 높은 알파벳부터 숫자를 대입합니다.
3. 모든 단어들의 합을 계산한 후 출력합니다.
[주의할 점]
처음에는 가중치가 아니라 가장 앞에 있는 알파벳부터 숫자를 대입하고자 하였습니다. 하지만 가장 앞에 있는 숫자부터 대입하면 예외가 발생합니다. 예를 들어서 ABB + BB + BB + BB + BB + BB + BB의 경우 A에 9, B에 8을 대입하는 것이 아니라 A에 8, B에 9를 대입하는 것이 정답입니다. 따라서 알파벳의 모든 위치를 고려한 가중치를 계산하고 숫자를 대입하였습니다.
[코드]
if __name__ == "__main__":
n = int(input()) # 단어의 개수
word = [list(input().strip()) for _ in range(n)] # 단어 입력
v = dict() # 각 알파벳의 가치 계산
visited = set()
for i in range(len(word)):
for j in range(len(word[i])):
if word[i][j] not in visited:
v[word[i][j]] = pow(10, (len(word[i]) - j - 1))
visited.add(word[i][j])
else:
v[word[i][j]] += pow(10, (len(word[i]) - j - 1))
# 가치가 높은 수부터 값 대입
value = []
for key in v.keys():
value.append([v[key], key])
# 가치순으로 내림차순 정렬
value.sort(reverse=True)
selected = dict()
d = 9
for i in range(len(value)):
selected[value[i][1]] = d
d -= 1
# word 숫자로 변환
for i in range(len(word)):
for j in range(len(word[i])):
word[i][j] = selected[word[i][j]]
result = 0
for i in range(len(word)):
result += int("".join(map(str, word[i])))
print(result)
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 18809] Gaaaaaaaaaarden - Python (0) | 2020.11.25 |
---|---|
[ 백준 1707 ] 이분 그래프 - Python (0) | 2020.11.24 |
[ 백준 17281 ] ⚾ - Python (2) | 2020.10.17 |
[ 백준 17136 ] 색종이 붙이기 - Python (0) | 2020.10.16 |
[ 백준 2463 ] 비용 - Python (0) | 2020.10.08 |