[백준 문제] 1339번 단어 수학 (파이썬)


[백준 문제] 1339번 단어 수학 (파이썬)

[백준 문제] 1339번 단어 수학를 풀어본다.

나의 생각의 흐름

  • 첫번째 시도 :
    • 순열로 다 넣어가면서 풀어보자.
    • 알파벳이랑 숫자를 어떻게 매칭 시키지? 그래. 딕셔너리!
    • 심지어 9부터 내림차순으로 넣으면 시간도 줄겠네?
    • 코딩 후 오~ 잘되는데
    • 9개 문자 들어갔더니 9! = 362880번 돌아가네?
    • 백준에 채점
    • 역시 시간 초과 후 급 노화
  • 두번째 시도 :
    • 아 순열 때려치고 넌센스문제라고 생각하자.
    • {‘G’: 100, ‘C’: 1010, ‘F’: 1, ‘A’: 10000, ‘D’: 100, ‘E’: 10, ‘B’: 1} 이런식으로 딕셔너리 써서 만들고
    • 이거를 내림차순으로 만들어서 9부터 넣으면 되겠다.
    • 백준 채점
    • 성공 급 회춘

깨달은점

  • 일단 시간초과 뜰만한 코드는 짜지도 말자
  • 변수이름을 좀 직관적으로 지어야 겠다. 다음날 다시 봤더니 뭐가 뭔지 하나도 모르겠어서 다시 짰다..
  • 딕셔너리 공부좀 해야겠다

내 2번째 풀이 (성공)

# 단어 갯수 지정
word_n = int(input())

# 단어들 리스트 만들기
word_lst = []
for _ in range(word_n) :
    word_lst.append(input())

# 문자들 마다에 곱해야할 수 딕셔너리화 시키기 {'G': 100, 'C': 1010, 'F': 1, 'A': 10000, 'D': 100, 'E': 10, 'B': 1}
alpha_digit_dic = {}

for each_lst in word_lst :
    cnt = 0
    for i in each_lst :

        if i not in alpha_digit_dic :
            alpha_digit_dic[i] = 10 ** (len(each_lst) - cnt - 1)
        elif i in alpha_digit_dic :
            alpha_digit_dic[i] += 10 ** (len(each_lst) - cnt - 1)
        cnt += 1

# 딕셔너리 Key값을 내림차순으로 솔팅하고 9부터 차례대로 곱해주기
digit_lst = sorted(list(alpha_digit_dic.values()), reverse = True)

sum = 0
for i in range(len(digit_lst)) :
    sum += digit_lst[i] * (9 - i)
ans = sum
print(ans)

내 첫번째 풀이 (시간 초과)


def prev_permutation(a):
    i = len(a)-1
    while i > 0 and a[i-1] <= a[i]:
        i -= 1
    if i <= 0:
        return False
    j = len(a)-1
    while a[j] >= a[i-1]:
        j -= 1

    a[i-1],a[j] = a[j],a[i-1]

    j = len(a)-1
    while i < j:
        a[i],a[j] = a[j],a[i]
        i += 1
        j -= 1

    return True


N = int(input())
arr = []
lst = []

for _ in range(N) :
    x = input()
    arr.append(x)

## 중복 제거 리스트 만들기
for ele in arr :
    lst += ele

lst = list(set(lst))
lst.sort()

## 딕셔너리 만들기

num = []
for i in range(len(lst)) :
    num.append(9-i)

## 합계 계산기
def cal(a) :
    sum = 0
    for i in range(len(a)) :
        sum += a[i]*10**(len(a)-i-1)
    return sum

## 풀이
max_sum = 0
while True:
    dic = dict(zip(lst, num))
    all_sum = 0
    for i in arr :
        num_arr = []
        for j in i :
            num_arr.append(dic[j])
        all_sum += cal(num_arr)
    max_sum = max(all_sum, max_sum)
    if not prev_permutation(num) :
        break

print(max_sum)





© 2018. by statssy

Powered by statssy