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

단간단간·2024년 4월 2일
0

알고리즘 문제

목록 보기
39/106

문제 링크:

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

회고:

  • python의 str.replace() 메서드를 사용하면 코드는 훨씬 깔끔해질 수 있기는 하다.

    def solution2(s):
        num_dic = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7",
                   "eight": "8", "nine": "9"}
        answer = s
        for key, value in num_dic.items():
            answer = answer.replace(key, value)
        return int(answer)
  • str.replace() 메서드는 원본 문자열을 순회하며 지정된 부분 문자열을 찾고 다른 문자열로 대체한다. 즉,원본 문자열이 길어질수록, 부분 문자열의 대체 작업이 많이 필요할수록 시간 복잡도가 증가한다.

  • 아래의 solution 메서드와 위의 solution2 메서드를 비교했다. 문자열의 길이가 길어질수록 solution2 메서드의 시간이 월등하게 증가하는 걸 볼 수 있다.

    # solution 메서드 시간 체크
    start_time = time.time()
    solution("one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10")
    print(time.time() - start_time)
    
    # solution2 메서드 시간 체크
    start_time = time.time()
    solution2("one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10one4seveneightone4seveneight23four5six71zerotwozero3123twotwothree10")
    print(time.time() - start_time)
    0.0005748271942138672
    4.410743713378906e-05

python

def convert_string_to_number(s: str) -> tuple:
    numbers = {
        "zero": "0",
        "one": "1",
        "two": "2",
        "three": "3",
        "four": '4',
        "five": "5",
        "six": "6",
        "seven": "7",
        "eight": "8",
        "nine": "9",
    }

    for i in range(3, len(s) + 1):
        if s[:i] in numbers.keys():
            return numbers[s[:i]], i


def solution(s: str) -> int:
    start = 0
    number_list = []

    for i in range(len(s)):
        if i < start:
            continue

        # 숫자인지 확인
        if s[i].isdigit():
            number_list.append(s[i])
        else:
            result = convert_string_to_number(s[i : i + 5])

            number_list.append(result[0])
            start = i + result[1]

    return int("".join(number_list))
profile
simple is best

0개의 댓글