[파이썬 코딩 테스트] 숫자 문자열과 영단어

ch.2·2024년 8월 2일
0

코딩 테스트

목록 보기
16/21
post-thumbnail

문제

프로그래머스 연습 문제 Lv.1

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

나의 풀이

.replace( )로 하나하나 치환

def solution(s):
    answer = 0
# s 문자열 중에서 'one',  'two' 등 영어로 적혀있는 문자를 '1, '2'와 같은 형식으로 교체한다. 위치는 바꾸지 않는다.
    s = s.replace('one', '1') # replace 한 걸 s에 재할당해야 함.
    s = s.replace('two', '2')
    s = s.replace('three', '3')
    s = s.replace('four', '4')
    s = s.replace('five', '5')
    s = s.replace('six', '6')
    s = s.replace('seven', '7')
    s = s.replace('eight', '8')
    s = s.replace('nine', '9')
    s = s.replace('zero', '0')
    return int(s) # int로 변환
  • 숫자를 치환하는 거니까 당연하게 1부터 시작했다.
    0부터 시작할 수도 있다는 것을 제대로 인지하고 있었다면 인덱싱도 생각이 났을 법하다.
    사고 체계 흐름의 분리가 아쉬웠다.

다른 사람의 풀이

딕셔너리 활용

def solution(s):
    nums = {
        'zero' : '0',
        'one' : '1',
        'two' : '2',
        'three' : '3',
        'four' : '4',
        'five' : '5',
        'six' : '6',
        'seven' : '7',
        'eight' : '8',
        'nine' : '9'
    }
    for key, value in nums.items():
        s = s.replace(key,value)
    return int(s)
  • 딕셔너리를 활용하여 영단어숫자를 키-밸류의 구조로 연결했다.
  • for 반복문에서 .items( ) 메서드를 활용하고 .replace로 키와 밸류의 값을 바꿔주었다.

해당 풀이의 댓글에 딕셔너리 대신 리스트를 활용하여 enumerate를 사용하는 방법이 있다고 해서 작성해보았다.

재풀이

리스트, enumerate( ) 활용

def solution(s):
    nums = ['zero', 'one', 'two', 'three', 'four',
    'five', 'six', 'seven', 'eight', 'nine']
    for index, word in enumerate(nums):
        s = s.replace(word, str(index))
    return  int(s)
  • 영단어를 리스트로 정의하고, for문에서 영단어영단어의 인덱스를 치환해주었다.
    이때 .replace에는 문자열만 들어갈 수 있으므로 인덱스는 str( )을 사용해 문자열로 바꿔주고 return 할 때 int()를 사용했다.

enumerate 대신 range(len( ))을 사용하는 방법도 있다.

리스트, range(len( )) 활용

def solution(s):
    nums = ['zero', 'one', 'two', 'three', 'four',
    'five', 'six', 'seven', 'eight', 'nine']
    for i in range(len(nums)):
        s = s.replace(nums[i], str(i))
    return int(s)
  • nums의 i번째 순서에 있는 영단어 nums[ i ] 를, str(i) 로 치환해주었다.
    마찬가지로 return 할 때 int()를 사용했다.
profile
데이터 분석 공부중

0개의 댓글