문제 5번은 입력받은 숫자를 거꾸로 출력하는 문제이다. 파이썬에서는 리스트 인덱싱과 슬라이싱을 사용하여 반복문을 사용하지 않고 풀 수도 있다. 해당 포스트에서는 리스트 인덱싱과 반복문(for, while), 그리고 재귀를 사용하여 풀어보았다.


문제 5) 숫자를 거꾸로 출력


문제 5. 숫자를 거꾸로 출력

사용자에게 정수 N(0 < N <= 1,000,000)을 입력받고, N을 거꾸로 출력하는 프로그램
1. Input the number : 123456 
    654321
2. Input the number : 2584697
    7964852
3. Input the number : 649731
    137946
4. Input the number : 119911
    119911


코드 및 풀이

(1) list indexing

# 리스트 인덱싱 사용

def backward_basic():
    n = input("Input the number(0 < n <=1,000,000) : ")
    if int(n) > 0 and int(n) <= 1000000:
        print(n[::-1])
    else:
        return "Input the number in given range."


### 실행 ###
backward_basic()

### 출력 ###
# Input the number(0 < n <=1,000,000) : 1234
# 4321

리스트 인덱싱을 사용하여 주어진 범위의 숫자를 문자열로 입력받은 후 리스트 인덱싱을 통해 숫자를 거꾸로 출력하면 된다. 범위를 벗어날 경우에는 예외처리를 해주었다.


(2) while

# while 사용

def backward_while():
    n = input("Input the number(0 < n <=1,000,000) : ")
    if int(n) >= 1000000:
        return "Input the number in given range."
    i = 0
    ln = len(n) 
    while i < ln:
        print(n[ln-i-1], end="")
        i += 1
        
### 실행 ###
backward_while()

### 출력 ###
# Input the number(0 < n <=1,000,000) : 1234
# 4321

while문을 사용하여 i가 주어진 문자열의 길이를 넘지 않을 동안 마지막 인덱스의 값부터 출력하고 i1만큼 증가시켰다. 그리고 print() 메서드 안에서 end=""인자를 사용하여 반복문 종료까지의 값이 한 줄로 출력되도록 처리해주었다.


(3) for

# for 사용

def backward_for():
    n = input("Input the number(0 < n <=1,000,000) : ")
    ln = len(n)
    if int(n) >= 1000000:
        return "Input the number in given range."
    for a in range(ln):
        print(n[ln - a - 1], end="")


### 실행 ###
backward_for()

### 출력 ###
# Input the number(0 < n <=1,000,000) : 1234
# 4321

while문을 썼던 것과 동일한 방법으로 풀었다. 사용하여 입력받은 숫자의 길이만큼 반복문을 돌면서 n의 마지막값부터 출력한다.


(4) recursive function

재귀를 사용하여 두 가지 방법으로 풀어보았다.

# 재귀 사용

def recursive05():
    num = str(input("Input the number : "))
    ln = len(num)
    
    def backward_recursive01(num):
        if num[0] == num:
            return num
        
        return num[-1] + backward_recursive01(num[:-1])
    
    def backward_recursive02(num):
        if num[0] == num:
            return num
        
        return backward_recursive02(num[1:]) + num[0]
    
    print('(1) : ', backward_recursive01(num))
    print('(2) : ', backward_recursive02(num))


backward_recursive01(num) 이해하기

backward_recursive01(num)는 입력받은 숫자의 마지막 인덱스 값을 앞으로 가져오고 마지막 인덱스 값을 제외한 문자열을 계속해서 반환하는 방식을 반복한다. 예를 들어, 12345를 입력했을 경우 다음과 같은 방식으로 리턴값을 반환한다.

num[-1] + backward_recursive01(num[:-1])

# output = 54321 
# ln = 5일 때 5 + 1234
# ln = 4일 때 4 + 123 
# ln = 3일 때 3 + 12
# ln = 2일 때 2 + 1
# ln = 1일 때 1        탈출조건 충족 
# input = 12345

탈출조건의 경우에는 문자열 길이가 0이 될 경우 None값을 반환하기 때문에 적절하지 않으므로 num[0]의 값이 num과 같을 경우(1글자) 그대로 num값을 리턴하는 방식으로 종료시켜주었다.


backward_recursive02(num) 이해하기ㄴ

backward_recursive02(num)는 위의 방식과 반대방향으로 동작한다. 입력받은 숫자의 첫번째 인덱스 값을 마지막 순서에 더하고 0번째 인덱스 값을 제외한 문자열을 계속해서 반환하는 방식을 반복한다. 예를 들어 12345를 입력했을 경우 다음과 같은 방식으로 리턴값을 반환한다.

backward_recursive02(num[1:]) + num[0]

# output = 54321
# ln = 5일 때 5432 + 1
# ln = 4일 때 543 + 2 
# ln = 3일 때 54 + 3
# ln = 2일 때 5 + 4
# ln = 1일 때 5       탈출조건 충족   
# input = 12345


실행시간 측정해보기

메서드의 실행시간을 측정하는 runtime()를 여러 번 실행하여 실행시간의 평균값을 측정하였다.

# 작성한 메서드를 100000번씩 반복 실행하여 나온 실행속도의 평균값 구하는 함수를 avg()로 정의하였다.

	
# (1) 리스트 슬라이싱
avg(backward_basic)
# 0.024862601538188756   

# (2) while
avg(backward_while)
# 0.024396212422288954

# (3) for
avg(backward_for)
# 0.023717234143987298

# (4) recursive
avg(recursive05)
# 0.026360990363173187



Julia Hwang

디발자를 꿈꾸는 웹개발자의 블로그입니다.