IT recording...
[BOJ] 1339 단어 수학 - python 본문
https://www.acmicpc.net/problem/1339
풀이
|
메모리 초과 코드
더보기
import sys
from itertools import permutations
#모든 단어에 최대 알파벳 개수 = 10개 (0~9)
#한 수의 최대 자리수 8자리
#모든 단어들을 분해해서 set에 넣어두고 가능한 모든 경우의 수 하기
#set(A,B,C,D,E) -> 9부터 알파벳 개수만큼
#뭐하나를 고정해놓기 (숫자를 고정 9,8,7,6,5)
#알파벳을 변경 (순열로 모든 조합 구하기)
def mInput():
return sys.stdin.readline().rstrip()
N = int(mInput())
word = [mInput() for _ in range(N)]
def getAlphaNum(per):
dict = {}
for i,p in enumerate(per):
dict[p]=9-i
#print("DICT",dict)
return dict
word_set = set()
for w in word:
word_set.update(set(list(w)))
#print(word_set)
permut = list(permutations(word_set,len(word_set)))
#print("permut : " ,permut)
answer = 0
for per in permut:
dict = getAlphaNum(per)
#word 합 구하기
sum = 0
for w in word:
alpha = list(w)
alphaToNum = []
for a in alpha:
alphaToNum.append(str(dict[a]))
num = int(''.join(alphaToNum))
sum += num
answer = max(answer,sum)
print(answer)
코드
import sys
# greedy -> 각 알파벳의 중요도를 기록하자
# 어차피 모든 알파벳의 합을 구하는 것이므로 각 알파벳이 존재하는 자릿수를 기록해놓는다면 최대를 구할 수 있음
def input():
return sys.stdin.readline().rstrip()
N = int(input())
word = [input() for _ in range(N)]
alpha_dict = {} # 알파벳별 자릿수에 몇 번 나타났는지를 기록할 딕셔너리
for w in word:
for i, alpha in enumerate(w):
if alpha in alpha_dict:
alpha_dict[alpha] += pow(10, len(w) - i - 1)
else:
alpha_dict[alpha] = pow(10, len(w) - i - 1)
sorted_dict = list(alpha_dict.values())
sorted_dict.sort()
sorted_dict = list(reversed(sorted_dict))
sum = 0
number = 9
for sd in sorted_dict:
sum += number * sd
number -= 1
print(sum)
얻어가는 것
느낀점
"211111"
소요 시간 : 1h
- 메모리 초과, 시간 초과 생각해서 문제를 풀도록 하자
- 자릿수를 풀 때는 이렇게도 풀 수 있구나 를 깨달은 문제
- 잊고있었던 비트 연산을 생각나게 한 문제였다.
'Algorithm' 카테고리의 다른 글
[BOJ] 1062 가르침 - python (0) | 2021.12.02 |
---|---|
[BOJ] 11660 구간 합 구하기 5 - python (0) | 2021.12.02 |
[BOJ] 11659 구간 합 구하기 4 - python (0) | 2021.12.02 |
[BOJ] 2580 스도쿠 - python (0) | 2021.12.02 |
[BOJ] 1759 암호 만들기 - python (0) | 2021.12.02 |
Comments