영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.
"onetwothreefourfivesixseveneightnine"를 숫자로 바꾼 123456789를 return합니다.
"onefourzerosixseven"를 숫자로 바꾼 14067를 return합니다.
"one" = 1,
"two" = 2, ... 와 같은 형태로 특정 문자열을 숫자로 변경해야 하므로 어떤 함수를 써야할까 찾아보다 replace 함수로 가능하겠다 싶었다.
// replace 함수 예제
val_test = '123,456,789,123'
val_new = val_test.replace(',', ':')
print(val_new)
-- Result
123:456:789:123
출처: https://cosmosproject.tistory.com/316
그래서 다음과 같이 작성했다.
def solution(numbers):
result = int(numbers.replace("one","1").replace("two","2").replace("three","3").replace("four","4").replace("five","5").replace("six","6").replace("seven","7").replace("eight","8").replace("nine","9").replace("zero","0"))
return result
replace 지옥을 만들었다. 지저분한 코드인 건 알지만... 테스트 통과하길래 제출해봤는데...
7점 획득 무엇...?
마음을 알 수 없는 알고리즘이다.
그렇다면 고수들은 어떻게 풀었다 살펴봤다.
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)
for num, eng in enumerate(["zero", "one", ..., "nine"]):
"zero"부터 "nine"까지 문자열을 담은 배열을 만들어준다. 그리고 num
을 인덱스로, eng
을 반복할 요소로 넣어준다.
(반복문이 실행될 때마다 다음과 같이 결과값이 나온다.)
0, "zero"
1, "one"
...
9, "nine"
numbers = numbers.replace(eng, str(num)):
replace 함수에 eng과 num을 넣어준다. (eng을 num으로 변경해준다는 뜻이다. ex. "zero" -> 1)
return int(numbers): 결과값은 숫자이므로 int()로 타입을 변환해준다.
파이썬에 for in enumerate
라는 똑똑한 반복문이 있었는지 다시 한번 기억을 되살려보는 기회가 되었다.