[Python] 프로그래머스 - Level1 - 숫자 문자열과 영단어

강주형·2022년 8월 8일
0

https://school.programmers.co.kr/learn/courses/30/lessons/81301

2021 카카오 채용연계형 인턴십

def solution(s):
    answer = ''
    number = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    i = 0
    while len(s) > 0:
        if s[:i] in number:
            answer += str(number.index(s[:i]))
            s = s[i:]
            i = -1
        try:
            answer += str(int(s[0]))
            s = s[1:]
            i = -1
        except:
            pass
        finally:
            i += 1
    return int(answer)

다른 사람들 코드 보니까 대부분 replace()를 사용했던데
나는 좀 특이하게 푼 것 같다.

finally는 예외 발생 여부에 상관없이 작동하는 코드를 넣음

s를 앞에서부터 자릿수를 늘려가면서 탐색하다가 영단어나 숫자를 발견하면 answer에 넣고 슬라이싱해서 앞으로 당기는 방식으로 구현했음
앞으로 당기다가 s가 '' 되면 (len(s) == 0) while문을 끝내도록 설정

  1. 영단어를 발견하면 if문 작동
    -> 슬라이싱 후 i = -1로 초기화 후 i += 1 해서 i = 0

  2. 숫자를 발견하면 try문 작동
    -> 슬라이싱 후 i = -1로 초기화 후 i += 1 해서 i = 0

  3. 둘 다 발견 못하면 i += 1만 하고 종료


타인 코드 1

num_dic = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5", "six":"6", "seven":"7", "eight":"8", "nine":"9"}

def solution(s):
    answer = s
    for key, value in num_dic.items():
        answer = answer.replace(key, value)
    return int(answer)

타인 코드 2

def solution(s):
    words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

    for i in range(len(words)):
        s = s.replace(words[i], str(i))

    return int(s)

근데 replace() 자체가 시간 복잡도가 높은 편이라고 함
주어진 테스트 케이스에서는 타인 코드가 더 빠른 듯..
while문이 시간을 많이 잡아 먹나?


  1. replace() 사용 생각하기
  2. 딕셔너리로 for문 돌리는 거 익히기
profile
Statistics & Data Science

0개의 댓글