[BOJ] Q1339 단어 수학
[BOJ] Q1339 단어 수학
Question
Language: Python
Difficulty: Gold 4
주어진 문자열에 대해서, 문자열을 구성하는 알파벳을 숫자로 치환해서, 각각의 문자열들을 숫자로 변환 했을때, 숫자들이 가질 수 있는 최대값을 구하는 문제이다.
- 처음에는 자리수만 높으면 된다고 생각했다. 그래서 아래와 같이 각 알파벳에 대해 최고 자리수만 저장하게 되었다.
conversion=defaultdict(int)
for string in strings:
length=len(string)
for i in range(length):
conversion[string[i]]=max(conversion[string[i]],length-i)
temp_list=[(value,index) for index,value in conversion.items()]
temp_list.sort(key=lambda x: -x[0])
하지만 위와 같이 생각하게 되면 아래와 같은 반례가 존재가 발생한다.
3
BCA
ABC
ACB
정답: A=9,B=8,C=7 2844 오답: A=8,B=9,C=7 2754
- 오 그러면, 최고 자리수 위치에 있는 알파벳의 갯수를 구하는 식으로 생각하였다.
conversion={alphabet : [0,1] for alphabet in set(alpha_sets)}
for string in strings:
length=len(string)
for i in range(length):
if length-i == conversion[string[i]][0]:
conversion[string[i]][1]+=1
conversion[string[i]][0]=max(conversion[string[i]][0],length-i)
temp_list=[(value,index) for index,value in conversion.items()]
temp_list.sort(key=lambda x: (-x[0][0],-x[0][1]))
하지만 위의 경우 또한 아래와 같은 반례가 존재한다.
10
ABB
BC
BC
BC
BC
BC
BC
BC
BC
BC
정답: A=8,B=9,C=7 1772 오답: A=9,B=8,C=7 1771
- 곰곰히 생각해보면, 최고 자리수, 각각의 자리수에 해당하는 개수를 모두 고려했을 때 나오게 되는 것이 바로 해당 알파벳들의 위치값들을 모두 더해서 구성하는 방식이다.
즉, ABCDD와 같이 있을때, A=10000, B=1000,C=100,D=11로 만들게 되면, 정확한 비교가 가능해진다.
Solution
from collections import defaultdict
def solution():
conversion=defaultdict(int)
digits=[10**i for i in range(8)]
for string in strings:
length=len(string)
for i in range(length):
conversion[string[i]]+=digits[length-i-1]
temp_list=[(value,index) for index,value in conversion.items()]
temp_list.sort(key=lambda x: (-x[0]))
num=9
for value,index in temp_list:
conversion[index]=num
num-=1
result=0
for string in strings:
length=len(string)
for i in range(length):
string[i]=str(conversion[string[i]])
result+=int("".join(string))
return result
if __name__ == "__main__":
N=int(input())
alpha_sets=[]
strings=[list(input().strip()) for _ in range(N)]
print(solution())
댓글남기기