알고리즘 스터디
[백준] 1339번 : 단어수학 - Python(파이썬)
히치키치
2021. 3. 22. 12:57
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부터 내림차순 곱