<로직 고민>
- 이것도 일단 딕셔너리를 활용하면 좋을 것 같고...
en_to_num = {
"zero":0,
"one":1,
"two":2,
"three":3,
"four":4,
"five":5,
"six":6,
"seven":7,
"eight":8,
"nine":9,
}
- for문을 돌려서 일치하는 값이 있으면 replace함수를 써서 숫자로 바꾸면 되려나?
- 일단 numbers를 for문을 돌리면 스펠링 하나하나 나온다
for num in numbers:
print(num)
o
n
e
f
o
u
r
z
e
r
o
s
i
x
s
e
v
e
n
- 이렇게 스펠링 하나씩 나온다 이걸 새로운 변수에 더해주고 if문으로 딕셔너리 안에 새로운 변수가 있는지를 물어야겠다
en_num = 0
for num in numbers:
en_num += num
# 출력화면
# TypeError: unsupported operand type(s) for +=: 'int' and 'str'
- en_num을 정수형으로 선언하니 타입에러가 뜬다
- 일단 num이 문자열이므로 en_num로 문자로 선언한다
en_num = ""
for num in numbers:
en_num += num
if en_num in en_to_num:
- for문이 2번 돈 상태라면 en_num에는 "on"이 담겨있어서 en_to_num이라는 딕셔너리 안에 없어서 if문을 통과하지 못한다
- 3번째에는 en_num="one"이 되어서 if문을 통과한다
- 이제 en_num에 담긴 "one"을 1로 바꾸자
en_num = en_num.replace(en_num, en_to_num[en_num])
# 출력화면
# en_num = en_num.replace(en_num, en_to_num[en_num])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# TypeError: replace() argument 2 must be str, not int
- if문 아래를 이렇게 짰더니 타입에러가 나온다...ㅎㅎ....
- 딕셔너리의 value 값이 정수형으로 되어 있어서 그런 거 같다 큰따옴표를 붙여주겠다
en_to_num = {
"zero":"0",
"one":"1",
"two":"2",
"three":"3",
"four":"4",
"five":"5",
"six":"6",
"seven":"7",
"eight":"8",
"nine":"9",
}
en_num = ""
for num in numbers:
en_num += num
if en_num in en_to_num:
en_num = en_num.replace(en_num, en_to_num[en_num])
print(en_num)
- 이렇게 하고 print문을 찍어보니 1 하나 나온다...왜 for문이 안 도는 거지
- 아!!!! en_num이 1이 되고 다음 for문이 쭉쭉 돌면 1four가 돼서 1때문에 if문을 통과할 일이 안 생기는 거구나
for num in numbers:
en_num += num
print(en_num)
if en_num in en_to_num:
en_num = en_num.replace(en_num, en_to_num[en_num])
print(en_num)
- 이렇게 2군데 print문 찍어보니까 가관이다 ㅋㅋㅋ
o
on
one
1
1f
1fo
1fou
1four
1fourz
1fourze
1fourzer
1fourzero
1fourzeros
1fourzerosi
1fourzerosix
1fourzerosixs
1fourzerosixse
1fourzerosixsev
1fourzerosixseve
1fourzerosixseven
- ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
- answer라는 변수에 1을 담도록 하자...!
answer, en_num = "", ""
for num in numbers:
en_num += num
if en_num in en_to_num:
answer = en_num.replace(en_num, en_to_num[en_num])
return answer
print(solution("onefourzerosixseven"))
- 또 1만 나온다 또 뭔가 문제가 있군
...
if en_num in en_to_num:
answer = en_num.replace(en_num, en_to_num[en_num])
print(en_num)
print(answer)
return answer
print(solution("onefourzerosixseven"))
# 출력화면
# one
# 1
# 1
- en_num은 one, anwer는 1....또 if문을 통과하고 있지 않다는건데
for num in numbers:
en_num += num
print(en_num)
print(answer)
if en_num in en_to_num:
answer = en_num.replace(en_num, en_to_num[en_num])
# return answer
print(solution("onefourzerosixseven"))
# 출력화면
# o
# on
# one
# onef
# 1
# onefo
# 1
# onefou
# 1
# onefour
# 1
# onefourz
# 1
# onefourze
# 1
# onefourzer
# 1
# onefourzero
# 1
# onefourzeros
# 1
# onefourzerosi
# 1
# onefourzerosix
# 1
# onefourzerosixs
# 1
# onefourzerosixse
# 1
# onefourzerosixsev
# 1
# onefourzerosixseve
# 1
# onefourzerosixseven
# 1
# None
- 진짜 가관이고만....3번째 for문 돌고 en_num이 one 됐을 때 딕셔너리 키 중에 있는 걸로 인식해서 1로 잘 바꼈는데 그 다음부터는 문자열이 이어져서 딕셔너리 안에 없는 걸로 인식된 거군....
- replace 함수 다음에 en_num을 초기화 시키자...!!
if en_num in en_to_num:
answer = en_num.replace(en_num, en_to_num[en_num])
en_num = ""
return answer
- 이렇게 하니까 결과값이 7이 나온다...ㅋㅋㅎㅋㅋ
- 아
- answer에 차곡차곡 더해줘야 하는구나
answer += en_num.replace(en_num, en_to_num[en_num])
- 이렇게 수정하니까 감격의 정답 ....ㅠㅠㅠㅠㅠㅠㅠ
<완성된 코드>
def solution(numbers):
en_to_num = {
"zero":"0",
"one":"1",
"two":"2",
"three":"3",
"four":"4",
"five":"5",
"six":"6",
"seven":"7",
"eight":"8",
"nine":"9",
}
answer, en_num = "", ""
for num in numbers:
en_num += num
if en_num in en_to_num:
answer += en_num.replace(en_num, en_to_num[en_num])
en_num = ""
return int(answer)
print(solution("onetwothreefourfivesixseveneightnine")) # 123456789
print(solution("onefourzerosixseven")) # 14067
<다른 사람 풀이>
- 천재풀이1
def solution(numbers):
for num, eng in enumerate(["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]):
numbers = numbers.replace(eng, str(num))
return int(numbers)
- 와....맨날 enumerate는 언제 쓸 수 있는거지 했는데 이 문제에서 쓸 수 있었던 거구나.....와우.....
- 천재풀이2
def solution(numbers):
r = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',\
'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}
for k in r.keys():
numbers = numbers.replace(k, r[k])
return int(numbers)
- 딕셔너리 똑같이 썼는데 완전 간단하게 해결했네.....
- 딕셔너리를 쓰려면 이렇게 써야 하는건데,,,,후
- 내 코드 너무 창피하다
- 천재풀이3
def solution(numbers):
numbers = numbers.replace("one","1")
numbers = numbers.replace("two","2")
numbers = numbers.replace("three","3")
numbers = numbers.replace("four","4")
numbers = numbers.replace("five","5")
numbers = numbers.replace("six","6")
numbers = numbers.replace("seven","7")
numbers = numbers.replace("eight","8")
numbers = numbers.replace("nine","9")
numbers = numbers.replace("zero","0")
return int(numbers)
- 대박 단순하게 풀었네
- 나도 알고리즘 초반이었으면 이렇게 풀었을 듯
- 괜히 딕셔너리 써보겠다고 나대다가 코드만 늘렸네
- 천재풀이4
def solution(numbers):
dic = {
"one" : 1,
"two" : 2,
"three" : 3,
"four" : 4,
"five" : 5,
"six" : 6,
"seven" : 7,
"eight" : 8,
"nine" : 9,
"zero" : 0
}
answer = 0
i = 0
j = 1
N = len(numbers)
while i<N:
var = dic.get(numbers[i:j],False)
if type(var) == int:
answer *= 10
answer += var
i = j
j += 1
else:
j += 1
return answer
- 약간 나같은 사람...?ㅋㅋㅋ