포시코딩

[프로그래머스][Lv.1] 숫자 문자열과 영단어 본문

자료구조알고리즘/문제풀이

[프로그래머스][Lv.1] 숫자 문자열과 영단어

포시 2022. 12. 25. 04:54
728x90

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이

def solution(s):
    answer = ''
    numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    word = ''
    for e in s:
        if e.isdigit():
            answer += str(e)
            continue
        word += e
        if word in numbers:
            answer += str(numbers.index(word))
            word = ''
    
    return int(answer)

과거의 나였으면 저 number list를 dictionary로 구현했을 것이다. ex) {'zero': 0, 'one': 1, ...}

마찬가지로 비슷한 문제의 다른 풀이 방법에서 본걸 기억해내 써먹었다.

  • isdigit()
  • if - in 문
  • list.index(x)

이 세가지 방법도 마찬가지로 어디선가 봤던걸 활용해낸건데 아주 잘 써먹혔다.

역시 꾸준히 문제를 푸니까 이쪽으로 머리가 잘 굴러가는 것 같다.

하지만 착각은 하지말자 겨우 레벨1에 정답률도 67%나 되는 쉬운 문제다. 

 

다른 풀이

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를 활용하는 방법을 생각하지 못했는데

이 문제를 보다가 저렇게 range(len(words))로 index만 구해 쓰는거보다 enumerate를 하는게 더 낫지 않나 라는 생각이 들었다.

 

그래서 내가 직접 다시 풀어보았다.

 

내 풀이+

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

    for i, v in enumerate(numbers):
        s = s.replace(v, str(i))
        
    return int(s)

훨씬 깔끔해졌다.

문득 가독성이 좋아진것과 별개로 성능에서도 차이가 있는지 궁금해졌는데 

 

직접 실험을 통해 한 번 알아봤다. - [enumerate(list)와 range(len(list)) 비교]

 

enumerate(list)와 range(len(list)) 비교 - 작성중

개요 number = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] 위 list에 대해 for문을 돌려 각각의 index와 value를 얻어내는걸 한다면 enumerate(number)와 range(len(number)) 중 어떤게 더 효율이

4sii.tistory.com

 

예전에 풀었던 경험이 점점 밑거름이 되어 다음 문제를 풀 때 계속 도움을 주는

선순환이 반복되고 있는데 이 흐름을 멈추지말고 아직도 많이 남은 Lv.0 ~ Lv.1 문제를 빨리 다 풀고

Lv.2를 향해 나아가야겠다.

728x90