프로그래머스 숨어있는 숫자의 덧셈 (2) 파이썬 테스트 2,3,4,5,6,7 실패 해결

2023. 4. 3. 04:29_Study/Baekjoon

728x90
 
  프로그래머스 문제풀이 python
      No.  숨어있는 숫자의 덧셈(2)

 

 

 

#파이썬 #프로그래머스 #문제풀이 # 숨어있는 숫자의 덧셈(2)

https://school.programmers.co.kr/learn/courses/30/lessons/120864

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이번 글에서는 python을 이용하여 문자열에서 숫자로 오고가는 방법에 중점을 둔다.

 


// 알고리즘

가장 중요한 목적이 무엇인지?

문자열을 슬라이싱하는 방법이다. 거기서 숫자에 해당하는 부분만 추출하고, 추출한 숫자를 다시 합쳐야한다.

왜 이런 방법을 선택했는지?

파이썬은 for i in word로 손쉽게 문자열을 쪼갤 수 있다. 이를 isdigit()함수를 이용해 숫자인 경우 따로 buffer을 만들어 모으고, join()함수를 사용하여 다시 합치면 숫자와 문자열의 변환을 간단하게 할 수 있는 파이썬의 특성을 살릴 수 있다.


// 계획하기

  함수명 설명  
1.      
2.      
3.      

함수는 따로 사용하지 않기로 했다.


// 구현하기

-> How?

어떻게 구현?

 

answer = 0

buffer = [] 리스트 생성

count =0 # 다음번이 숫자인지 확인하는 변수, count = 0 이면 문자가 지나갔다. 1 -> 0 의 경우 숫자가 지나갔다.

 

for i in my_string:

    if(숫자라면):

        count += 1

        buffer에 숫자를 더한다. (그래야 숫자 순서가 알맞다)

    else:

        if(count 가 0이 아니라면 숫자가 buffer에 담겨져있다 이를 조합해야한다)

            buffer을 join으로 다시 숫자로 바꾼뒤 더한다.

            buffer을 다시 비운다.

        count = 0 초기화

 

->Why?

왜 이런 방법을?

 

숫자인 경우, 숫자가 아닌 경우를 나누고, 버퍼를 이용해야하는데 숫자로 만들어 미리 더하는 경우 순서에 따라 문제가 발생했다. 예를 들어 34 인경우 첫 for 문에서 이 숫자가 3인지 30인지 300인지도 모르는채 계산을 해야하는 복잡함과, 3으로 계산하고 뒤에서 부터 40으로 계산되어 43이 더해지는 등 자잘한 오류가 발생해서. 차라리 배열로 만들어서 합쳐버리자는 생각을 했다.


// 수정하기

 

 

예전 코드는 테스트케이스 오류가 발생했었다. 이는 숫자로 끝나는 경우 반복문이 종료되어 buffer을 담지 못하여 발생하는 오류이다.

 

 

이를 깔끔하게 해결하는 방법으로 python의 특성을 활용하였다.

 

 

my_string이라는 문자열 뒤에 아무 문자열이나 붙이면 for 문을 한 번 더 돌면서 buffer값을 끝까지 넣게 된다.

 


// 완성코드

 

 

import math

def solution(my_string):
    answer = 0
    buffer = []
    count = 0
    my_string+='a' #아무 글자나 추가해서 늘리기
    for i in my_string:

        #다음번이 숫자인지 확인 해야한다.
        if (i.isdigit()):
            count += 1
            buffer.append(i)
            #buffer += int(i) * int(math.pow(10, count) // 10)
        else:
            if(count != 0):
                buffer = "".join(buffer)
                answer += int(buffer)
                buffer = []
            count = 0


    return answer