문자열 필수 replace 활용

1. 문제

 

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

 

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

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

programmers.co.kr

 

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

 

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

 

1478 → "one4seveneight"

234567 → "23four5six7"

10203 → "1zerotwozero3"

 

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

 

그림1. 숫자에 대응되는 영단어

 

2. 제한사항

 

s의 길이는 1이상 50이하

 

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

 

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

 

 

3. 입출력 예시

 

그림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으로 바꿔준다

 

그림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

 

TAGS.

Comments