Your task is to write the word to number converter. Digits in the number should match letters in the word. Plus generated number should be the smallest possible number you can get.
당신의 임무는 주어진 단어를 숫자로 바꾸는 것입니다. 숫자들(digits)은 반드시 단어안에 문자들(letters)과 매칭이 되어야합니다. 또한 숫자를 생성할 땐 만들 수 있는 숫자들 중 가장 작은 숫자로 만들어야합니다.
None
"A" -> 1 - OK
"ABA" -> 353 - WRONG ( number is OK, but it's not the smallest number )
"ABA" -> 333 - WRONG ( different letters map to same digits )
"ABA" -> 357 - WRONG ( same letters map to different digits )
def convert(st):
digit_num_dic = {}
num_list = ['9','8','7','6','5','4','3','2','0','1']
result = ''
if len(st) == 0:
return 0
for v in st.upper():
if v in digit_num_dic:
result += digit_num_dic[v])
else:
num = num_list.pop()
digit_num_dic[v] = num
result += num
return int(result)
def convert(s):
w2n = dict(zip(dict.fromkeys(s.upper()), '1023456789'))
return int('0' + ''.join([w2n[ch] for ch in s.upper()]))
너무 예쁜 파이써닉한 코드입니다.🎃
저 같은 경우 for loop를 통해 dict를 만들고 검증하는 과정이 들어있는데 여기서는 fromkeys와 zip 메서드를 활용해 미리 사전을 만들어버리는 원리입니다.
fromkeys같은 경우는 밸류가 없이 키만 있는 사전을 만들수 있습니다. 해당 메서드를 통해 문자열을 하나하나 잘라 키만 있는 사전을 만듭니다. dict의 기본속성 상 중복을 허용하지 않으므로 중복제거도 문제없이 됩니다. 이 상태에서 zip을 통해 병렬배치를 하고 다시 dict로 바꿔주면 문자-숫자가 매칭이 완성된 사전을 만들게됩니다. 이를 다시 문자열을 돌리면서 숫자를 빼내서 문자열로 붙여주면 완성!
다만 빈 문자열일 경우 0을 리턴해야 하므로 '0'을 앞에다가 놔둡니다.