본문 바로가기

Programming/#Python

[Python] 제어문 (fin) (실습 결과 포함)

본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다. 

 

 

 


이전 게시글

두근두근 파이썬 Chapter 3 변수와 연산자 (2)

2021/01/11 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 3 제어문 (2) (실습 결과 포함)

 


0. 들어가며

이전 포스팅에서는 반복문 중 for문의 다양한 응용 문법과 예제를 접해보았다. 이번 포스팅에서는 이중 for문 (중첩 루프)의 활용성에 대해 고찰하고, 또 다른 반복문인 while문과 이러한 반복문을 제어하는 키워드인 break, continue에 대해 다뤄볼 것이다.

 

1. 중첩 for 루프

구구단의 구조와 같이 이중 for문 (nested for loop)이 필요한 상황이 있다. 이런 상황에서는 다음과 같이 내부 루프와 외부 루프를 중첩하여 문제를 해결할 수 있다. 

 

구구단의 구조를 for loop로 표현

 

# 구구단의 출력
>>> for i in range(2, 10): # 외부 for 루프
	for j in range(1, 10): # 내부 for 루프
    	print('{} * {} = {}.format(i, j, i*j), end = ' ')
        '''
    print() # 내부 루프 수행 후 줄 바꿈'''
    
2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

 

위의 이중 루프 실행 구조를 표로 나타내 보면 다음과 같다. 보통 중첩 반복문을 사용할 때는 삼중 루프 이상의 구조는 사용하지 않는다. 

 

 

 

2. 중첩 루프를 이용한 패턴 만들기

중첩루프의 응용 예제로 다음과 같은 패턴을 만들어보자. 

 

출력할 패턴

 

 

위와 같은 패턴을 생성하는 두 가지 방법이 있다. 첫 번째는 이중 루프문을 활용하여 각 줄의 띄어쓰기 칸 수를 지정해주는 방법이고, 두 번째 방법은 print문 내에서 공백의 출력 횟수를 지정하는 방식이다. 이 두 가지 방법 중 이중 루프를 사용하지 않는 편이 더 쉽고 간단하다. 

# 이중 for 루프를 사용하는 경우
>>> n = 7
>>> for i in range(n):
	st = ' '
    for j in range(i):
    	st += ' '
    print(st + '#')
    

# 이중 for 루프를 사용하지 않는 경우
>>> n = 7
>>> for i in range(n):
	print(' ' * i + '#')

 

LAB 3-9: 패턴 출력 응용
# 이중 루프를 사용하는 경우
>>> n = 7
>>> for i in range(n):
	st = ' '
	for j in range(n-i):
    	st += ' '
    print(st + '#')

       #
      #
     #
    #
   #
  #
 #
        
# 이중 루프를 사용하지 않는 경우
>>> n = 7
>>> for i in range(n):
	print(' ' * (n-i) + '#')

       #
      #
     #
    #
   #
  #
 #

 

3. 상향식 문제풀이 기법

이중 for 루프를 이용하여 만들 두 번째 패턴은 다음과 같다. 다음 패턴은 문자 '+'이 줄을 바꿀 때마다 1, 3, 5, 7, 9번 반복되는 규칙을 갖고 있다. 이러한 규칙의 패턴을 작은 기능으로 전체 기능을 구현하는 방법인 상향식(bottom up) 문제 풀이 기법을 통해 풀어보겠다.

 

 

# 공백의 개수
>>> n = 5
>>> for i in range(5):
	print(n-(i+1), end = ' ')

4 3 2 1 0

# 문자의 개수 
>>> n = 5
>>> for i in range(5):
	print(2*i+1, end = ' ')
    
1 3 5 7 9

# 상향식 풀이 기법
>>> n = 5
>>> for i in range(n):
	for j in range(n-(i+1)):
	    print(' ', end = '')
    for j in range(2*i+1):
    	print('+', end = '')
    print()


    +
   +++
  +++++
 +++++++
+++++++++

 

위와 같이 상향식 문제 해결 기법으로 전체의 큰 문제를 해결하기 위한 작은 프로그램을 먼저 설계해보는 것이 중요하다. 이를 통해 부품으로 쓰일 작은 기능들이 문제 없이 작동하는지 확인할 수 있다. 

 

같은 기능의 짧은 코드
>>> n = 5
>>> for i in range(n):
	print(' ' * (n-(i+1)), end = ' ' )
    print('+' * (2*i+1))

 

4. 소수 구하기

이중 for문 다음 예제로 소수를 구하는 프로그램을 구현해보자. 여기서 소수란 1과 자기 자신 이외의 약수를 갖지 않는 수를 말한다. 마찬가지로 해당 프로그램도 상향식 문제 풀이 기법을 적용하여 소수인지 판별하는 프로그램을 먼저 설계한다. 

# 소수인지 판별하는 프로그램
>>> n = int(input('수를 입력하세요:'))
수를 입력하세요: 

>>> is_prime = True
>>> for num in range(2, n):
	if n % num == 0: # 1과 자기자신(n)을 제외한 약수가 있으면
    	is_prime = Flase # 소수가 아님
>>> print(n, 'is prime:', is_prime)
    
# 2부터 100까지의 소수 구하기
>>> primes = []
>>> for n in range(2, 101):
	is_prime = True
    for num in range(2, n):
    	if n % num == 0:
        	is_prime = False
     
    if is_prime:
    	primes.append(n) # 소수일 경우 리스트에 할당
        
>>> print(primes)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

 

5. while 반복문

while문은 for문과 달리 조건을 만족하는 경우 반복 횟수 없이 계속해서 실행되는 반복문이다. 조건만 참이라면 계속 반복해서 실행한다는 점에서 if문과도 유사하다.

 

 

# for 문을 이용한 반복 출력
>>> for i in range(5):
	print('Welcome to everyone!!')

Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!

# while 문을 이용한 반복 출력
>>> i = 0 # 초기값
>>> while i < 5:
	print('Welcome to everyone!!')
    i += 1

Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!
Welcome to everyone!!

 

반면, 다음과 같이 반복 횟수가 명확히 주어지는 경우에는 중지 조건을 명시하기 위해 여러 줄의 코드를 할당해야 하는 while문 보다는 for문을 통해 간결히 작성하는 것이 낫다. 반대로, 수행횟수는 정확히 모르지만 수행의 조건이 명확한 경우에는 while문이 더 적당하다. 

>>> n = int(input('합계를 구할 수를 입력하세요:'))
합계를 구할 수를 입력하세요 : 100

>>> s = 0
>>> i = 1
>>> while i <= n:
	s = s + i
    i += 1
>>> print('1부터 {}까지의 합은 {}'.format(n, s))
1부터 100까지의 합은 5050

 

가위바위보 게임
>>> selected = None
>>> while selected not in ['가위', '바위', '보']:
	selected = input('가위, 바위, 보 중에서 선택하세요>')

>>> print('선택한 값은:', selected)

가위, 바위, 보 중에 선택하세요> 묵
가위, 바위, 보 중에 선택하세요> 찌
가위, 바위, 보 중에 선택하세요> 빠
가위, 바위, 보 중에 선택하세요> 가위

선택한 값은: 가위

 

1부터 n까지의 합을 구하는 코드
# for문으로 구현
>>> n = int(input('합계를 구할 양의 정수를 입력하세요:'))
합계를 구할 양의 정수를 입력하세요: -10
>>> s = 0 
>>> for i in range(1, n+1):
	s += i
    
>>> print('1부터 {}까지의 합은 {}'.format(n, s))
1부터 -10까지의 합은 0 # 오류

# while문으로 구현
>>> n = -1
>>> while n <= 0:
	n = int(input('합계를 구할 양의 정수를 입력하세요:'))
합계를 구할 양의 정수를 입력하세요: -10
합계를 구할 양의 정수를 입력하세요: 0
합계를 구할 양의 정수를 입력하세요: 10

>>> s = 0
>>> for i in range(n+1):
	s += i
    
>>> print('1부터 {}까지의 합은 {}'.format(n, s))
1부터 10까지의 합은 55

 

6. break와 continue

지금까지 다룬 반복문은 특정 조건을 만족할 때까지 동일한 실행을 반복한다는 특징이 있다. 이때, 특정 조건을 만족하지 않고도 반복문을 제어할 수 있는 키워드가 바로 break와 continue이다. 먼저, break는 반복문의 실행을 종료하는 역할을 하며, continue는 루프 내의 나머지 실행부를 건너 뛰어 계속 반복 루프를 돌게끔 한다. 이때 유의할 점은 continue 키워드가 루프를 종료하는 역할을 하지 않는다는 것이다. 

 

각각 break와 continue의 흐름도

 

# break
>>> st = 'Programming'

# 자음이 나타나는 동안만 출력
>>> for ch in st:
	if ch in ['a', 'e', 'i', 'o', 'u']:
    	break
    print(ch)
>>> print('The end')

P
r
The end

# continue
st = 'Programming'

# 자음이 나타날 때만 출력
>>> for ch in st:
	if ch in ['a', 'e', 'i', 'o', 'u']:
    	continue # 아래 문장만 건너 뛰고 다시 반복문으로 돌아감
    print(ch)

>>> print('The end')

 

지금까지 살펴본 break와 continue는 프로그램의 제어를 효율적으로 할 수 있다는 점에서 유용하지만, 남용하는 경우 제어 흐름의 일관성을 깨 프로그램의 이해도를 떨어뜨린다. 따라서 두 키워드는 반드시 사용해야 할 때 계획적으로 쓰는 것이 좋다. 


다음 게시글

두근두근 파이썬 Chapter 4 함수와 입출력 (1)

2021/01/13 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 4 함수와 입출력 (1) (실습 결과 포함)

 

 


 

 

 

 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)