24년 11월 이전/레거시-알고리즘(3)

[프로그래머스 2단계] 알고리즘 20. 자연수를 뒤집어 리스트로 만들기

Gurumee 2018. 4. 5. 11:25
반응형

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


알고리즘 20. 자연수를 뒤집어 리스트로 만들기


digit_reverse함수는 양의 정수 n을 매개변수로 입력받습니다. n을 뒤집어 숫자 하나하나를 list로 표현해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴하면 됩니다.


def digit_reverse(n):
# 함수를 완성해 주세요
return ''

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


풀이 : 

이번 문제의 핵심은 자연수를 자릿수마다 리스트를 만든 후에 뒤집으면 된다. 제일 간단한 방법으로는 다음 방법이 있다.


def digit_reverse(n):
return [int(i) for i in str(n)][::-1]


바로 정수를 str()로 문자열로 바꾼 후에 for 컴프리헨션으로 순회하여 리스트로 만들어주면 된다. 다만 


[i for i in str(n)]


을 하게 되면 ['1', '2', '3', '4', '5'] 이런 문자열들의 리스트가 된다. for 컴프리헨션 반환값을 숫자로 만들어주기 위해서는 int()를 쓰자.


[int(i) for i in str(n)]


그리고 리스트를 역으로 바꾸기 위해서는 대표적으로 reversed 함수[::-1]이 있다. 둘 다 리스트를 거꾸로 바꾼 리스트를 반환하니 둘 중 하나를 써도 상관은 없다. 


[int(i) for i in str(n)][::1]


이렇게 풀면 별로 기존 문제들 설명을 들은 사람이라면 얻어갈게 없을테니 이번엔 다른 방법을 제시해보겠다. 코드는 다음과 같다.


def custom_range(n, step=10):
while n > 0:
yield n % step
n //= step

def digit_reverse(n):
return [ i for i in custom_range(n)]


이번에는 yield 를 이용하여 사용자 정의 range 함수를 만드는 것이다. custom_range 함수는 개발자가 정의한 식에 따라 반복자가 돌 수 있는 Generator를 반환시킨다. Generator란 예를 들어 range(1, 10)이라 할 때 1부터 10까지 i가 돌 수 있는 컨테이너를 만들어준다. 이것이 바로 Generator이다. custom_range는 1의 자리 수를 뱉고 n을 10으로 자꾸 나누어준다. 즉 예에서 12345가 들어오면 5 -> 4 -> 3 -> 2 -> 1 을 내뱉는 Generator를 반환시킨다. 따라서 위 digit_reverse 함수는 이 Genrator를 순회하여 리스트 [5, 4, 3, 2, 1] 을 반환시켜준다. 필자도 파이썬에 대해 깊은 조예가 있는 것이 아니기 때문에 generator와 yield에 대한 자세한 설명은 구글링을 쳐보는것을 강추한다. 

728x90
반응형