한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ num_str ≤ 100
function solution(num_str) {
    return num_str.split('').reduce((acc, cur) => {
        return +acc + +cur;
    }, 0)
}

JS로 풀 때는 배열 메서드 쫙쫙 돌려가면서 신나게 풀었었는데! 벨로그에 올렸던 기억이 없어서 빼꼼히 한 번 올려봄

나의 풀이

첫 풀이

def solution(num_str):
    nums = []
    sum = 0
    
    for i in range(len(num_str)):
        nums.append(int(num_str[i]))
        
    for i in range(len(nums)):
        sum += nums[i]

    return sum

엉망으로 풀었다... 아직 for문도 잘 못 쓰는 초보임

일단 split() 함수로 어케 쪼개는지... 아직 사용법을 모르기 때문에 (공부할거임) for문을 두 번 돌렸다. 허허... 너무 부끄러운 풀이임... 기본 문법들 좀 다시 열심히 공부해야겠당

그냥 nums 배열에 num_str의 0번 인덱스부터 끝까지 하나씩 넣어주고, 그 배열을 또 돌면서 sum에다가 더해서 최종 결과를 반환한다.

개선된 풀이

from functools import reduce

def solution(num_str):
    return reduce(lambda acc, cur: int(acc) + int(cur), num_str, 0)

첫 번째 풀이를 제출하고 넘 답답해서 python의 reduce 함수를 찾아봤다. 내 사랑 reduce... 근데 이건 내장 함수가 아니라서 functools 모듈을 임포트해줘야 한다. 그렇게 reduce 사용법을 한 번 익혀보겠음.

* reduce()

reduce(집계함수, iterable[, ...,초기값]

reduce() 함수는 반복가능한 객체(iterable: ex. list, dictionary, set, string) 내의 요소를 연산한 뒤 결과들을 누적해서 반환해주는 함수다.

JS에서의 reduce()랑 비슷하다. 집계함수는 두 개의 인자를 받아야 하는데 누적자(accumulator)와 현재값(current)이다. 초기값을 기준으로 루프를 돌며 데이터를 누적하여 연산한다.

이걸 람다 표현식을 사용해서 풀어봤다.

reduce(lambda acc, cur: int(acc) + int(cur), num_str, 0)

  • lambda 함수에 acc(누적값), cur(현재값) 두 개의 인자를 받도록 설정한 후 우리에게 주어진 문자열을 숫자열로 바꾸는 작업을 거친 후 acc와 cur을 계속해서 더해주는 함수를 첫 번째 인자로 넣어주었다.
  • iterable 자리에는 num_str 문자열 값을 넣어주었다.
  • 초기값은 0으로 설정한다.

그래서 num_str를 순회하면서 첫 번째 인덱스부터 마지막 인덱스까지의 문자열의 합을 구할 수 있게 했다.

앞으로도... 많이 사용해봐야지...

참고한 블로그
[파이썬] reduce 함수에 대해 알아보자(feat. lambda 표현식)
파이썬 reduce 함수 사용법

다른 풀이 1

def solution(num_str):
    return sum(map(int, list(num_str)))
  • map을 사용해서 num_list 문자열의 요소를 전부 숫자로 바꿔주었다.
  • sum으로 변환된 list의 모든 요소의 합을 구한다.

num_str 자체가 iterable이기 때문에 list로 변환하는 작업은 꼭 필요한 것은 아니다.

* map()

map(function, iterable)

map() 함수는 여러 개의 데이터를 받아서 각 요소에 함수(function)를 적용한 결과를 반환한다. iterable 객체를 입력으로 받을 수 있다.

참고한 블로그
[python] map 함수 사용법, 동작원리 및 특징 (예제포함)

다른 풀이 2

solution=lambda s:sum(map(int,s))

같은 메서드를 사용하였지만 lambda 함수를 사용해서 풀이한 게 신기해서 가져옴... 연습해야징

profile
영차영차 😎

0개의 댓글

Powered by GraphCDN, the GraphQL CDN