파이썬 1부터 n까지 출력 - paisseon 1buteo nkkaji chullyeog

📍 코드업 1901 - 1부터 n까지 출력하기

코드업 1901 - 1부터 n까지 출력하기

⚡️ 나의 풀이

재귀함수 문제 중 같은 문제라도 1부터 n까지 구하는 문제가 있는 반면, n부터 1까지 역순으로 구하는 문제도 있다.

재귀함수에서 알아두어야 할 자료구조는 스택(stack)이다. stack의 특성 상 재귀함수는 나중에 들어온 값이 제일 먼저 나가게 되는 후입선출(LIFO)구조인데, 여기서도 제일 마지막에 호출한 함수를 제일 먼저 호출하는 과정을 거친다.

이 문제는 1부터 n까지 구하는 문제인데, 함수의 호출 순서를 알고 싶어 print(f(n))을 설정했다.
또 마지막에 return을 적지 않아도 되지만, 어떠한 흐름으로 진행되는지 알고싶어 명시적으로 적었다.

전체적인 흐름은 다음과 같다.

입력값에 5가 들어오게 되면 5는 1과 같지않으므로 bottom_up(4)를 호출하게된다. bottom_up(4)는 1과 같지않으므로 bottom_up(3)를 호출하게 되고 마지막으로 n이 1일 때는 print(n)을 거치고 return을 하게된다. return을 할 때는 스택에 호출됐던 함수들을 다시 찾아간다(밑에서부터) bottom_up(1)을 호출한 n=2는 print(n)을 하게되고 또 다시 올라가게된다. 결과적으로 print는 1에서부터 n까지 출력하게 된다.

nstackprint
5 bottom_up(4) 5
4 bottom_up(3) 4
3 bottom_up(2) 3
2 bottom_up(1) 2
1 1 1

하단에 사진은 재귀함수 호출의 흐름을 화살표로 그려봤다.

파이썬 1부터 n까지 출력 - paisseon 1buteo nkkaji chullyeog

def bottom_up(n):
    print(f'f({n})', end=' ')
    if n != 1:
        bottom_up(n-1)
    
    print(f'f({n})', n)
    return

bottom_up(5)

👉🏽 
f(5) 
f(4) 
f(3) 
f(2) 
f(1) f(1) 1
f(2) 2
f(3) 3
f(4) 4
f(5) 5

파이썬 1부터 n까지 출력 - paisseon 1buteo nkkaji chullyeog
프로그램 1-1

1부터 n 까지 연속한 숫자의 합을 구하는 알고리즘 ①

◉ 예제 소스 p01-1-sum.py

# 1부터 n까지 연속한 숫자의 합을 구하는 알고리즘 1

# 입력: n

# 출력: 1부터 n까지의 숫자를 더한 값

def sum_n(n):

    s = 0                     # 합을 계산할 변수

    for i in range(1, n + 1): # 1부터 n까지 반복(n + 1은 제외)

        s = s + i

    return s

print(sum_n(10))              # 1부터 10까지의 합(입력: 10, 출력: 55)

print(sum_n(100))             # 1부터 100까지의 합(입력: 100, 출력: 5050)

파이썬 1부터 n까지 출력 - paisseon 1buteo nkkaji chullyeog
실행 결과

어땠나요? 어렵지 않게 프로그램을 이해하고 입력해서 실행해 볼 수 있었을 것입니다.

TIP

프로그램1-1의 알고리즘은 합을 계산할 변수s에0을 넣고 첫 번째 수인1을 더하는 것으로 계산을 시작하였습니다. 즉,1+2 =3이 아니라 0+1 =1이 첫 덧셈입니다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

파이썬 1부터 n까지 출력 - paisseon 1buteo nkkaji chullyeog

1902 : (재귀 함수) 1부터 n까지 역순으로 출력하기

문제 설명

정수 n부터 1까지 출력하는 재귀함수를 설계하시오.

이 문제는 반복문 for, while 등을 이용하여 풀수 없습니다.

금지 키워드 : for, while, goto
시간 제한 : 1 Sec
메모리 제한 : 128 MB

입력

정수 n이 입력된다(1<=n<=200)

출력

n부터 1까지 한 줄에 하나씩 출력한다.

입력 예시

10

출력 예시

10
9
8
7
6
5
4
3
2
1

풀이

n = int(input())
def func(n):
  print(n)
  if(n!=1):
    func(n-1)
func(n)

'10.1 리스트 만들기'에서 range에 시작하는 숫자와 끝나는 숫자를 지정하거나, 증가폭을 지정하는 방법을 배웠죠? 이번에는 range의 다양한 기능을 활용하여 for 반복문을 사용해보겠습니다.

16.2.1  시작하는 숫자와 끝나는 숫자 지정하기

range에 횟수만 지정하면 숫자가 0부터 시작하지만, 다음과 같이 시작하는 숫자와 끝나는 숫자를 지정해서 반복할 수도 있습니다.

  • for 변수 in range(시작, 끝):

>>> for i in range(5, 12):    # 5부터 11까지 반복
...     print('Hello, world!', i)
...
Hello, world! 5
Hello, world! 6
Hello, world! 7
Hello, world! 8
Hello, world! 9
Hello, world! 10
Hello, world! 11

5부터 11까지 출력되었죠? for i in range(5, 12):와 같이 지정하면 5부터 11까지 5, 6, 7, 8, 9, 10, 11이 나오고 7번 반복합니다. 즉, 마지막 숫자는 range의 끝나는 숫자보다 1이 작습니다(끝나는 숫자는 생성된 숫자에 포함되지 않음).

16.2.2  증가폭 사용하기

range는 증가폭을 지정해서 해당 값만큼 숫자를 증가시킬 수 있죠? 이번에는 0부터 9까지의 숫자 중에서 짝수만 출력해보겠습니다.

  • for 변수 in range(시작, 끝, 증가폭):

>>> for i in range(0, 10, 2):    # 0부터 8까지 2씩 증가
...     print('Hello, world!', i)
...
Hello, world! 0
Hello, world! 2
Hello, world! 4
Hello, world! 6
Hello, world! 8

for i in range(0, 10, 2):와 같이 range에 0, 10, 2를 넣으면 0부터 8까지 2씩 증가합니다. 따라서 숫자는 0, 2, 4, 6, 8이 나오고 5번 반복하죠. 여기서는 증가폭이 2이므로 8 다음에는 10이 나와야 하지만, range에 끝나는 숫자를 10으로 지정했으므로 10은 포함되지 않고 8에서 멈춥니다.

16.2.3  숫자를 감소시키기

forrange는 숫자가 증가하면서 반복했습니다. 그럼 숫자를 감소시킬 수는 없을까요?

>>> for i in range(10, 0):    # range(10, 0)은 동작하지 않음
...     print('Hello, world!', i)
...

range(10, 0)과 같이 시작하는 숫자를 큰 숫자로 지정하고 끝나는 숫자를 작은 숫자로 지정하면 숫자가 감소할 것 같은데, 실행을 해보면 아무것도 출력되지 않습니다. 왜냐하면 range는 숫자가 증가하는 기본 값이 양수 1이기 때문입니다.

'10.1 리스트 만들기'에서 range에 증가폭을 음수로 지정하면 숫자가 감소한다고 했죠? 다음과 같이 증가폭을 음수로 지정해서 반복해봅니다.

>>> for i in range(10, 0, -1):    # 10에서 1까지 1씩 감소
...     print('Hello, world!', i)
...
Hello, world! 10
Hello, world! 9
Hello, world! 8
... (생략)
Hello, world! 2
Hello, world! 1

range(10, 0, -1)은 10부터 1까지 -1씩 증가하는 숫자를 생성합니다. 따라서 10부터 1까지 1씩 감소하면서 반복합니다. 특히 range의 끝나는 숫자 0은 생성되는 숫자에 포함되지 않으므로 1까지만 감소합니다. range는 그냥 증가, 감소에 상관없이 끝나는 숫자는 생성되는 숫자에 포함되지 않는다는 점만 기억하면 됩니다.

증가폭을 음수로 지정하는 방법 말고도 reversed를 사용하면 숫자의 순서를 반대로 뒤집을 수 있습니다.

  • for 변수 in reversed(range(횟수))
  • for 변수 in reversed(range(시작, 끝))
  • for 변수 in reversed(range(시작, 끝, 증가폭))

>>> for i in reversed(range(10)):    # range에 reversed를 사용하여 숫자의 순서를 반대로 뒤집음
...     print('Hello, world!', i)    # 9부터 0까지 10번 반복
...
Hello, world! 9
Hello, world! 8
Hello, world! 7
... (생략)
Hello, world! 1
Hello, world! 0

range(10)으로 0부터 9까지 숫자를 생성한 뒤 reversed를 사용하여 숫자의 순서를 반대로 뒤집었습니다. 따라서 9부터 0까지 10번 반복합니다.

참고 | 반복문의 변수 i를 변경할 수 있을까?

다음과 같이 forrange로 반복하면서 변수 i를 변경하면 어떻게 될까요?

>>> for i in range(10):
...     print(i, end=' ')
...     i = 10 
...
0 1 2 3 4 5 6 7 8 9

반복할 코드에서 변수 i에 10을 할당하여 10이 출력될 것 같은데, 0부터 9까지 출력되었습니다. 왜냐하면 변수 i는 반복할 때마다 다음 값으로 덮어써지기 때문에 값을 할당해도 변수에 영향을 주지 못합니다.

16.2.4  입력한 횟수대로 반복하기

이번에는 입력한 횟수대로 반복을 해보겠습니다. 다음 내용을 IDLE의 소스 코드 편집 창에 입력하세요.

for_range_input.py

count = int(input('반복할 횟수를 입력하세요: '))
 
for i in range(count):
    print('Hello, world!', i)

소스 코드를 실행하면 '반복할 횟수를 입력하세요: '가 출력됩니다. 여기서 3을 입력하고 엔터 키를 누르세요.

실행 결과

반복할 횟수를 입력하세요: 3 (입력)
Hello, world! 0
Hello, world! 1
Hello, world! 2

3을 입력했으므로 'Hello, world!'가 3번 출력됩니다.

먼저 input으로 입력 값을 받아서 count 변수에 저장합니다(이때 반드시 int를 사용하여 input에서 나온 문자열을 정수로 변환해줍니다). 그리고 반복문에서는 for i in range(count):와 같이 rangecount를 넣어주면 입력받은 숫자만큼 반복됩니다.