CodingTest/Programmers

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

EEOOOO 2022. 6. 22. 13:24

/  제출 1  /

어우 큰일입니다. 아직도 lv1에서 틀리다니...

def solution(s):
    answer = ''
    num = ''
    num_dict = {'one':1, 'two':2, 'three':3,
                 'four':4, 'five':5,'six':6,
                'seven':7, 'eight':8,'nine':9}
    
    for ch in s:
        if ch.isdigit():
            answer += ch
        else:
            num += ch
            if num in num_dict:
                answer += str(num_dict[num])
                num= ''
        
    return int(answer)
채점 결과
정확성: 70.0
합계: 70.0 / 100.0

7, 8, 9에서 실패했습니다.

그리고 더 문제인건 끙끙대다가 테케 맞으면 신나서 제출하는 습관을 또 못 버리고 이번에도 그렇게 한 것 입니다.
명심합시다! 테케 통과하면 할 일은 예외사항 따지고 이게 진! 짜! 안 틀릴 코드인지 복기하는 것입니다. 제출하는 것 아닙니다.

 

/  오류 정정  /

 

아휴.. 아니나 다를까 마지막 검토를 안 해서 생긴 실패였습니다. 딕셔너리 작성 시에 0의 경우를 기입하지 않았습니다.

해서 0을 딕셔너리에 넣어줬습니다.

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

 

/  제출 2  / 

def solution(s):
    answer = ''
    num = ''
    num_dict = {'zero':0, 'one':1, 'two':2, 'three':3,
                 'four':4, 'five':5,'six':6,
                'seven':7, 'eight':8,'nine':9}
    
    for ch in s:
        if ch.isdigit():
            answer += ch
        else:
            num += ch
            if num in num_dict:
                answer += str(num_dict[num])
                num= ''
        
    return int(answer)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 

 


/  다른 분들 풀이  /

 

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)

와.. replace() 를 쓸 생각은 못했는데..

문자열에 바로 이런 식으로 구현하면 10번 안에 문자열이 깔끔하게 대치수정 가능해집니다.

이러면 문자가 나올 때마다 모아서 바꾸는 방식보다 훨씬 빠르게 동작할 것 같습니다.

 

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)

 

이 분도 비슷하게 하셨는데 대신 숫자가 0-9의 제한 안에 있다는 것을 생각해 딕셔너리가 아닌 인덱스값으로 바로 연산해줬습니다. 바로 앞 전의 문제에서도 이러한 케이스가 나왔는데 재반복해서 보니까 좀 더 잘 익혀지는 것 같습니다.


 

문제의 구현 사항을 따라가며 만들면 이렇게 기본 내장 함수를 생각할 아이디어는 잘 안 나오는 것 같습니다.

자꾸 실수를 하니까 오늘은 차근차근 구현을 할 예정이기는 한데 이런 식으로 리팩토링하고 더 발전할 여지가 없는 지 체크도 꾸준히 해야할 것 같다고 생각되는 문제였습니다.