05의 개발 계발

[페어프로그래밍] 230406 영어가 싫어요 .replace() 본문

내일배움캠프 AI/페어프로그래밍

[페어프로그래밍] 230406 영어가 싫어요 .replace()

생각하는 코댕이 2023. 4. 6. 23:20
728x90

영어가 싫어요


페어프로그래밍 결과 코드

def solution(numbers):
    # 문자열을 단어로 분리
    # 각 단어를 인식해서 숫자로 변환한다.
    # 단어와 숫자의 한 쌍의 구조이므로 dict을 사용한다.
    number_dict = { "zero" : 0, 
    	"one" : 1, 
        "two":2, 
        "three" : 3, 
        "four":4, 
        "five": 5, 
        "six": 6, 
        "seven" : 7, 
        "eight" : 8, 
        "nine": 9
        }
    
    for key,value in number_dict.items():
        val = str(value) #replace는 문자열만 사용가능하다.
        numbers = numbers.replace(key,val)
        #num = numbers.replace(key,val) 안됨 !
        #다른 변수에 넣어버리면 for문을 돌면서 replace가 업데이트 되지 않는다. 계속 기존 numbers(파라미터)로 덮어씌워짐
        # numbers.replace(key,val) --> replace는 변수에 넣어줘야 한다
    return int(numbers)

리팩토링 코드 - 변수 직관화, 가독성 해치지 않는 선에서 변수 줄이기

def solution(numbers):
    number_dict = {"zero" : 0, "one" : 1, "two":2, "three" : 3, "four":4, "five": 5, "six": 6, "seven" : 7, "eight" : 8, "nine": 9}
    for num_str,num_int in number_dict.items():
        numbers = numbers.replace(num_str,str(num_int))
    return int(numbers)

흠터레스팅 코드

# 타입의 변화보다, 좀 더 수학적인 접근을 한 풀이
def solution(numbers):
    dic = {"one" : 1, 
    	"two" : 2, 
        "three" : 3, 
        "four" : 4, 
        "five" : 5,
        "six" : 6,
        "seven" : 7,
        "eight" : 8,
        "nine" : 9,
        "zero" : 0
    }
    answer = 0
    i = 0
    j = 1
    N = len(numbers)
    while i<N:
        var = dic.get(numbers[i:j],False)
        if type(var) == int:
            answer *= 10
            answer += var
            i = j
            j += 1
        else:
            j += 1
    return answer

시사점 or 새로이 알게된 점

<str>.replace(<str>,<str>)
- 정의 | 내장클래스 str의 인스턴스 메소드
           *인스턴스 메소드 = 객체의 self 값을 받아 인스턴스에 직접적으로 영향을 준다.
- 사용법 | 바꿀문자열.replace(이전문자,새문자)
- 결과 | 바꿀문자열에서 이전문자를 탐색하여 새문자로 변환
- Type | string

#1번
def solution(numbers):
    number_dict = {"zero" : 0, "one" : 1, "two":2, "three" : 3, "four":4, "five": 5, "six": 6, "seven" : 7, "eight" : 8, "nine": 9}
    for num_str,num_int in number_dict.items():
        numbers = numbers.replace(num_str,str(num_int))
    return int(numbers)
    
numbers = 'onetwothreefourfivesixseveneightnine'
print(solution(numbers)) #결과 123456789 | int type

1번 코드(리팩토링 코드)의 구조에서는 for loop에서 replace를 사용할 때는 반드시 numbers 에 저장해주어야만 한다.

#2번
def solution(numbers):
    number_dict = {"zero" : 0, "one" : 1, "two":2, "three" : 3, "four":4, "five": 5, "six": 6, "seven" : 7, "eight" : 8, "nine": 9}
    for num_str,num_int in number_dict.items():
        num = numbers.replace(num_str,str(num_int))
    return num
    
numbers = 'onetwothreefourfivesixseveneightnine'
print(solution(numbers)) #결과 'onetwothreefourfivesixseveneight9' | str type

만약 2번 같이 numbers가 아닌 다른변수 num에 저장을 할 경우,
num에는 replace의 값이 누적저장되지 않고 for loop의 마지막 동작인 numbers.replace('nine','9') 만 저장된다.

이는 for loop를 돌 때마다 numbers를 파라미터(함수에 입력된 numbers)에서 참조하기 때문인데,
1번 코드에서는 for loop를 돌 때마다 numbers를 재정의 해주기 때문에 replace의 결과가 누적 적용되어 원하는 결과를 얻을 수 있다.

아직 for loop에 대해 직관력이 부족해 코드리뷰 시 놓쳤던 부분이다.
다음에는 이런 실수가 생기지 않도록 주의하자.

728x90