문자열 필수 replace 활용

1. 문제

 

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

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

 

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

 

1478 → "one4seveneight"

234567 → "23four5six7"

10203 → "1zerotwozero3"

 

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return하도록 solution 함수를 완성하세요.

 

etc-image-0
그림1. 숫자에 대응되는 영단어

 

2. 제한사항

 

s의 길이는 1이상 50이하

 

s가 ‘zero’나 ‘0’으로 시작하는 경우는 주어지지 않아

 

return값이 1이상 2000000000이하의 정수가 되는 올바른 입력만 s로 주어짐

 

 

3. 입출력 예시

 

etc-image-1
그림2. 입출력 예시 설명

 

4. 나의 풀이

 

def solution(s):

    answer_list = []
    
    if s.isdigit():
        
        return int(s)
    
    else:
        
        str_list = list(s)
        
        while len(str_list) != 0:
            
            char = str_list.pop(0)
            
            if char.isdigit():
                
                answer_list.append(char)
                
            else:
                
                if char == 'z':
                    answer_list.append('0')
                    
                    for _ in range(3):
                        str_list.pop(0)
                
                elif char == 'o':
                    answer_list.append('1')
                    
                    for _ in range(2):
                        str_list.pop(0)
                
                elif char  == 'e':
                    answer_list.append('8')
                    
                    for _ in range(4):
                        str_list.pop(0)
                
                elif char == 'n':
                    answer_list.append('9')
                    
                    for _ in range(3):
                        str_list.pop(0)
                
                elif char == 't':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'w':
                        answer_list.append('2')
                        str_list.pop(0)
                    else:
                        answer_list.append('3')
                        for _ in range(3):
                            str_list.pop(0)
                
                elif char == 'f':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'o':
                        answer_list.append('4')
                        for _ in range(2):
                            str_list.pop(0)
                    else:
                        answer_list.append('5')
                        for _ in range(2):
                            str_list.pop(0)
                            
                elif char == 's':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'i':
                        answer_list.append('6')
                        str_list.pop(0)
                    else:
                        answer_list.append('7')
                        for _ in range(3):
                            str_list.pop(0)
        
        answer = int(''.join(answer_list))
        
    return answer

 

먼저 s.isdigit()을 이용해 전부 숫자이면 int(s)로 숫자로 치환해서 바로 return

 

def solution(s):

    answer_list = []
    
    if s.isdigit():
        
        return int(s)
    
    else:

 

isdigit()이 False이면 문자가 포함되었다는 말이므로 s를 list로 바꾸고

 

list에서 .pop(0)를 통해 맨 왼쪽의 글자를 하나씩 빼서 검사를 한다

 

    else:
        
        str_list = list(s)
        
        while len(str_list) != 0:
            
            char = str_list.pop(0)

 

숫자이면 새로 만든 answer_list에 그대로 넣고 숫자가 아니면 규칙에 맞게 검사를 한다

 

            if char.isdigit():
                
                answer_list.append(char)
                
            else:

 

첫 문자가 z이면 무조건 zero가 나올 것이므로 answer_list에 0을 넣고 나머지 e,r,o 3개를 반복해서 뺀다

 

문자를 뺄때는 반복문을 이용해서 for _ in range(n): str_list.pop(0) 을 수행

 

            else:
                
                if char == 'z':
                    answer_list.append('0')
                    
                    for _ in range(3):
                        str_list.pop(0)

 

마찬가지로 첫 문자가 o이면 one이 나올 것이므로 1을 answer_list에 넣고 n,e 2개를 반복해서 뺀다

 

첫 문자가 e는 8이고 첫 문자가 n은 9이므로 위와 비슷하게 수행

 

                elif char == 'o':
                    answer_list.append('1')
                    
                    for _ in range(2):
                        str_list.pop(0)
                
                elif char  == 'e':
                    answer_list.append('8')
                    
                    for _ in range(4):
                        str_list.pop(0)
                
                elif char == 'n':
                    answer_list.append('9')
                    
                    for _ in range(3):
                        str_list.pop(0)

 

반면 첫 문자가 t이면 two아니면 three이므로 다음 문자를 하나 더 뽑아서 w이면 2를 넣고 하나의 문자 o만 더 빼고 h이면 3을 넣고 r,e,e 3개의 문자를 뺀다

 

f나 s의 경우도 마찬가지로 할 수 있다

 

                elif char == 't':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'w':
                        answer_list.append('2')
                        str_list.pop(0)
                    else:
                        answer_list.append('3')
                        for _ in range(3):
                            str_list.pop(0)
                
                elif char == 'f':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'o':
                        answer_list.append('4')
                        for _ in range(2):
                            str_list.pop(0)
                    else:
                        answer_list.append('5')
                        for _ in range(2):
                            str_list.pop(0)
                            
                elif char == 's':
                    
                    next_char = str_list.pop(0)
                    
                    if next_char == 'i':
                        answer_list.append('6')
                        str_list.pop(0)
                    else:
                        answer_list.append('7')
                        for _ in range(3):
                            str_list.pop(0)

 

 

마지막에 answer_list에 들어온 문자들을 join으로 합친 뒤 int로 변경하면 끝

 

        answer = int(''.join(answer_list))
        
    return answer

 

5. 다른 풀이

 

replace를 이용하면 아주 간단하게 풀 수 있다

 

def solution(s):
    
    num_dict = {
        '0':'zero', '1':'one', '2':'two','3':'three',
        '4':'four', '5':'five', '6':'six','7':'seven',
        '8':'eight', '9':'nine'
    }
    
    for num, char in num_dict.items():
        
        s = s.replace(char, num)
    
    return int(s)

 

숫자와 영단어 사이 num_dict를 먼저 만들고 num_dict에서 num_dict.items()를 이용하여 숫자와 영단어를 하나씩 빼서

 

s.replace(char,num)을 이용해서 s에 들어간 영단어 char을 숫자 num으로 바꿔준다

 

for문을 모두 돌면 숫자로 바꾼 문자열만 나올텐데 int로 바꿔주면 끝

 

6. replace 함수에 대하여

 

replace는 s내에서 char에 해당하는 모든 문자를 num으로 바꿔준다

 

etc-image-2
그림3. replace에 대한 설명

 

7. 되돌아보기

 

논리적으로 생각 잘하고 시간을 최대한 줄이기 위해 생각을 잘 해서 코딩을 한 것은 맞다

 

그래도 replace로 깔끔하게 끝내는게 확실히 멋진것은 맞다

 

replace에 대해서도 기억을 잘 해놓자.. 특히 s.replace(char,num)하면 char 하나만 바꾸는 것이 아니라 s에 존재하는 모든 char을 num으로 바꿔준다는 점..

 

8. 참고

 

https://ooyoung.tistory.com/77

 

파이썬 replace( ) 문자열을 변경하는 함수 (Python)

replace( ) - 순서 - 1. replace 함수에 대한 설명 2. 함수 사용예시 1. replace 함수에 대한 설명 replace는 문자열을 변경하는 함수이다. 문자열 안에서 특정 문자를 새로운 문자로 변경하는 기능을 가지고

ooyoung.tistory.com

 

728x90