ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] 알고리즘 9. 자릿수 더하기
    24년 11월 이전/레거시-알고리즘(3) 2018. 3. 15. 23:28
    반응형

    문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


    알고리즘 9. 자릿수 더하기:

    sum_digit함수는 자연수를 전달 받아서 숫자의 각 자릿수의 합을 구해서 return합니다.예를들어 number = 123이면 1 + 2 + 3 = 6을 return하면 됩니다. sum_digit함수를 완성해보세요.


    def sum_digit(number):
    '''number의 각 자릿수를 더해서 return하세요'''
    return sum([int(i) for i in str(number)])

    # 아래는 테스트로 출력해 보기 위한 코드입니다.
    print("결과 : {}".format(sum_digit(123)));


    풀이:

    내가 푼 풀이는 간단하면서도 단순 무식하다. number가 1의 자릿수가 될때까지 1의 자릿수부터 최고 자릿수까지 10으로 나누어 몫은 number에 나머지는 sum에 저장하는 방법이다.


    코드로 보면 다음과 같다.


    def sum_digit(number):
    '''number의 각 자릿수를 더해서 return하세요'''
    sum = 0
    while number >= 10:
    sum += (number % 10)
    number //= 10

    return sum + number


    반복문을 통해 쉽게 작성하였지만 파이써닉하지 못하다. 나의 욕구를 만족시키지 못하는 코드였다. 그래서 다른 사람들의 기발한 풀이 몇가지를 적어보려 한다. 


    첫 번째 방법: 재귀


    def sum_digit(number):
    if number < 10:
    return number;
    return (number % 10) + sum_digit(number // 10)


    이 코드는 내가 생각했던 방법을 재귀로 옮겨놓은 코드이다.(실제로는 다른 사람이 코드를 짰지만 나의 의도와 정확하게 일치한다.) 여기서는 딱히 설명할 부분이 없기 때문에 어느 부분이 어느 역할을 하는지만 짚어보려 한다. 먼저 재귀의 탈출 조건은 나의 반복문의 탈출 조건과 같다.


    if number < 10:


    그 후 return number 는 나의 코드에서 return sum + number 의 number 역할을 한다! 재귀 호출문에서 


    return (number % 10) + sum_digit( ... )


    은 반복문의 while 밑에 있는


    sum += (number % 10)


    이 구문과 같다. 또한 ... 에 들어갈 구문


    number // 10


    은 반복문에서 


    number //= 10


    과 같다. 이렇게 정리하니까 더 알아보기 어려우려나.... 찬찬히 읽어보면 무슨 뜻인지 알 것이다. 


    두번째 방법: sum( [](list) ) 와 str(), int() 의 활용


    def sum_digit(number):
    return sum([int(i) for i in str(number)])


    내가 보면서 제일 놀란 코드이다. 코드를 해석하자면 먼저, number를 문자열로 만든다. 그러기 위해서 str()를 활용한다. 그리고 for 컴프리헨션으로 문자열을 순회하는데 int() 함수를 이용하여 i를 숫자로 만들어 반환하고 그 들을 리스트로 묶어준다. 그 후 sum()를 활용하여 각 리스트에 저장된 요소들의 합을 반환하는 코드이다. 정말로 파이써닉하지 않은가? 이 코드를 보면서 감탄의 감탄을 자아냈다..


    세번째 방법: sum() 과 map()의 활용


    def sum_digit(number):
    return sum(map(int,str(number)))


    이 부분은 파이썬3의 내장 함수인 sum과 map 함수를 활용한 것이다. map은 파이썬 API를 보면 


    map(function, iterable)


    로 되어 있는데 먼저 두 번째 인자로 순회할 수 있는 요소를 받고 첫 번째 인자로 그 요소들을 어떤 데이터로 바꿔주는지 지정하는 함수이다. 이 코드를 해석해보자면


    map(int,str(number))


    받은  number를 문자열로 바꾸고(str 함수, 파이썬 String은 Iterable 객체.) 그 숫자를 순회하면서 int()로 각 자릿수를 str -> int 형태로 바꾸는 것이다. 그 후 sum 함수를 통해 map을 통해 얻어진 컬렉션 객체의 합을 구하는 코드이다. 이는 내가 알지 못했던 map함수의 활용이 신기해서 가져와봤다. 확실히 이 세상에는 코딩 잘하는 사람들이 너무 많다. 나도 빨리 저런 신기하고도 멋진 코드를 짜는 날이 왔으면 좋겠다.

    728x90
Designed by Tistory.