[BOJ] 1336 단어 수학

해시, 그리디


해당 문제를 그리디로 접근한 정당성은 다음과 같다.

  • 단어를 숫자로 바꾸어 더한 수의 최대값을 구하는데 단어의 개수가 최대 10개인 점 즉, AB + B * 9 를 할 때 더 높은자리의 수에 높은 숫자(9→8→7)순으로 부여해도 된다는 점. 만약 단어의 개수가 10개보다 크다면? 다른 방법을 사용해야 할 수도 있다.(생각해보진 않음)

탐색을 위한 시간을 절약하기 위해 dictionary 사용

import sys

def solution(words):
    answer = 0
    words_math = dict()
    for word in words:  # 최대 10개
        wn = len(word)
        for i in range(wn-1, -1, -1):  # 최대 8개
            if word[i] in words_math:   # O(1)
                words_math[word[i]] += 10**(wn - 1 - i)
            else:
                words_math[word[i]] = 10**(wn - 1 - i)

    words_math_list = list(words_math.items())
    words_math_list.sort(key=lambda x: x[1], reverse=True)

    cnt = 9
    for word_tuple in words_math_list:
        words_math[word_tuple[0]] = cnt
        cnt -= 1

    for word in words:
        tmp = 0
        wn = len(word)
        for i in range(wn-1, -1, -1):
            tmp += words_math[word[i]]*10**(wn-1-i)
        answer += tmp
    return answer

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    _words = list()
    for _ in range(N):
        _words.append(list(sys.stdin.readline().rstrip()))
    print(solution(_words))

태그: ,

카테고리:

업데이트: