히치키치

[백준] 1339번 : 단어수학 - Python(파이썬) 본문

알고리즘 스터디

[백준] 1339번 : 단어수학 - Python(파이썬)

히치키치 2021. 3. 22. 12:57

www.acmicpc.net/problem/1339

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

 

풀이
  • 알파벳과 숫자 매칭 : 딕셔너리
  • 숫자와 알파벳의 자릿수 매칭 : 10의 제곱수 pow
  • 매칭된 숫자가 큰거 부터 9에서 내림차순으로 곱하기 : for문, (9 - i)
  • 최대 값 : 그리디 

코드
# 문제 : https://www.acmicpc.net/problem/1339
# import sys; sys.stdin.readline 사용 X

N=int(input())
words=[input() for _ in range(N)]


letter_digits={}

for word in words:
    cnt=len(word)-1
    for letter in word:
        if letter in letter_digits:
            letter_digits[letter]+=pow(10,cnt)
        else:
            letter_digits[letter]=pow(10,cnt)
        cnt-=1


digits=sorted(list(letter_digits.values()),reverse=True)
result=0
for i in range(len(digits)):
    result+=digits[i]*(9-i)
print(result)

 

헷갈렸던 점
#(1) sys로 입력 받는 경우 뒤에 공백문자까지 입력됨 -> 출력값 달라짐

#(2) 알파벳에 대응되는 자릿수(10의 제곱수)에서 몇 제곱인지 구하기

for word in words:
    cnt=len(word)-1 #for문으로 단어에서 한 글자씩 꺼낼때 맨 앞의 문자부터 나옴 ex.apple 이면 a
    for letter in word: #길이 - 1 인 이유 : apple -> a:1000=10^(5-1) 
        if letter in letter_digits: #단어 안에 여러번 등장하는 문자
            letter_digits[letter]+=pow(10,cnt)
        else: #단어 안에 한 개 있는 문자
            letter_digits[letter]=pow(10,cnt)
        cnt-=1 #그 다음 글자로 넘어가는데 그러면 자릿수도 낮아짐
        
#(3) 높은 자릿수에는 큰 수가 곱해져야 함. 
#-> 딕셔너리 키값을 내림차순으로 정렬 
#-> for문으로 곱하기 계산 시 9부터 내림차순으로 곱해져야함

digits=sorted(list(letter_digits.values()),reverse=True) #키(자릿수)기준 값 내림차순
result=0
for i in range(len(digits)):
    result+=digits[i]*(9-i) #9부터 내림차순 곱
Comments