1. 알고리즘이란
* 기초용어
먼저 두 숫자중 더 큰 숫자를 구하는 간단한 프로그램을 구현해보자.
a = int(input('첫 번째 숫자를 입력하세요. :'))
b = int(input('두 번째 숫자를 입력하세요. :'))
large = a
if b > large : large = b
print(f'더 큰 숫자는 {large}입니다.')
# 첫 번째 숫자를 입력하세요. : 10
# 두 번째 숫자를 입력하세요. : 25
# 더 큰 숫자는 25입니다.
- 순차구조 : 위와 같이 순서대로 처리되는 구조
- 복합문 : if문과 같이 복합적으로 이루어진 구문
- 대입문 : large = a 와 같은 단순한 구문
- 조건식 : if문 바로 뒤에 따라오는 조건
- 선택구조 : 조건식으로 평가된 결과에 따라 흐름이 변경되는 구조
* 조건문과 분기
100과 비교하는 프로그램을 구현해보자.
x = int(input('숫자를 입력하세요. :'))
if x > 100 :
print('100보다 크다')
elif x < 100 :
print('100보다 작다')
else :
print('100이다.')
# 숫자를 입력하세요. : 99
# 100보다 작다
- 프로그램의 흐름은 3개로 분기하였다. 동시에 시작되거나 하나도 실행되지 않는 경우는 없다.
- 단항 연산자 : 피연산자 1개를 의미한다. (ex. -x)
- 이항 연산자 : 피연산자 2개를 의미한다. (ex. x > y)
- 삼항 연산자 : 피연산자 3개를 의미한다. (ex. x if y else z)
int(input('숫자를 입력하세요. :'))
print('x는 100입니다.' if x==100 else 'x는 100이 아닙니다.')
# 숫자를 입력하세요. : 50
# x는 100이 아닙니다.
- 알고리즘 : 어떠한 문제를 해결하기 위해 정해 놓은 일련의 절차
2. 반복하는 알고리즘
* 반복과 조건판단
print('-와 =을 번갈아 출력')
n = int(input('몇 번 출력하시겠습니까? : '))
for i in range(n):
if i % 2:
print('=', end='')
else:
print('-', end='')
print()
# -와 =을 번갈아 출력
# 몇 번 출력하시겠습니까? : 5
# -=-=-
#
- 반복구조 : 어떤 조건이 성립하는 동안 반복처리 하는 구조 (일반적으로 루프라고 칭함.)
- 판단 반복 구조 : while문이나 for문에서 반복을 계속할지 판단하는 구조
- 루프 본문 : 조건식 뒤에 따르는 명령문
- 카운터용 변수 : 반복을 제어하기 위해 사용하는 변수 (주로 i로 사용)
- 위 프로그램은 2가지의 문제점이 있다. 첫 번째는 for문을 반복할 때마다 if문을 수행 한다는 것이다. n이 커질수록 if문의 실행횟수는 그만큼 늘어날 것이다. 두 번째는 수정이 복잡하다는 것이다. 카운터용 변수가 0부터 증가하므로 귀찮게 =을 먼저 기입하였다. 아래는 이러한 문제를 보완한 프로그램이다.
print('-와 =을 번갈아 출력')
n = int(input('몇 번 출력하시겠습니까? : '))
for _ in range(n // 2) :
print('-=', end ='')
if n % 2 :
print('-', end='')
print()
# -와 =을 번갈아 출력
# 몇 번 출력하시겠습니까? : 5
# -=-=-
#
- 위 for문은 더 이상 순환하며 반환하는 i가 필요 없으므로 _(언더바)를 사용하였다.
- n이 홀수일경우를 생각하여 나머지가 존재할 경우 ‘-’를 넣어주도록 하였다.
* break구현
import random
n = int(input('난수 개수 :'))
for _ in range(n) :
r = random.randint(1,99)
print(r, end='')
if r == 10:
print('\n 10의 출력으로 종료됩니다.')
break
else:
print('\n 난수 생성 종료')
# 난수 개수 : 5
# 7 56 42 89 46
# 난수 생성 종료
- for문에 break문으로 강제 종료를 삽입하였다.
- 10이 생성될 경우 else는 실행되지 않으며, 10이 생성되지 않을경우에 else문이 실행된다.
* 연속적인 비교연산자 사용
while True :
n = int(input('2자리 숫자를 입력하세요. :'))
if n >= 10 and n <=99 :
break
print(f'입력하신 숫자는 {n}입니다.')
# 2자리 숫자를 입력하세요. : 1
# 2자리 숫자를 입력하세요. : 999
# 2자리 숫자를 입력하세요. : 55
# 입력하신 숫자는 55입니다.
- 위는 의도적으로 무한루프를 생성하였다.
- 무한루프를 빠져나오려면 n이 10이상 99이하여야 하므로 비교연산자 두 개를 and연산자로 연결하였다.
- 드모르간의 법칙사용 : 부정 연산자를 사용하여 다음과 같이 나타낼 수 있다.
if not(n < 10 or no > 99) :
* 다중루프
print('구구단을 외자! '*2)
for i in range(1, 10):
for j in range(1, 10):
print(f'{i * j:3}', end='')
print()
# 구구단을 외자!구구단을 외자!
# 1 2 3 4 5 6 7 8 9
# 2 4 6 8 10 12 14 16 18
# 3 6 9 12 15 18 21 24 27
# 4 8 12 16 20 24 28 32 36
# 5 10 15 20 25 30 35 40 45
# 6 12 18 24 30 36 42 48 54
# 7 14 21 28 35 42 49 56 63
# 8 16 24 32 40 48 56 64 72
# 9 18 27 36 45 54 63 72 81
#
- 구구단 출력은 다중루프의 대표적인 예시이다.
- 먼저 나오는 for 구문은 1단부터 9단까지 아래로 행을 출력한다.
- 그 안에 있는 for 구문은 각 구구단을 출력하는 가로 방향의 반복문이다.
- 참고로 가지런하게 출력하기 위해서 j를 3자리로 출력하였다.
참고
이 글은 ‘이지스퍼블리싱’의 ‘자료구조와 함께 배우는 알고리즘 입문’을 공부 후 정리하며 쓴 글입니다.
작성된 모든 내용과 코드는 교재 및 관련 사이트를 참고하여 직접 재구성하였습니다.
Do it! 자료구조와 함께 배우는 알고리즘 입문 - 파이썬 편
이지스퍼블리싱 스터디룸 카페
교재 공식 깃허브
'Computer Science > Algorithm' 카테고리의 다른 글
<알고리즘> 삽입정렬과 병합정렬 (0) | 2021.12.20 |
---|---|
<알고리즘> 버블정렬과 선택정렬 (0) | 2021.02.03 |
<알고리즘> 재귀 알고리즘 (1) (0) | 2020.11.29 |
<알고리즘> 검색 알고리즘(2) (0) | 2020.11.08 |
<알고리즘> 검색 알고리즘 (1) (0) | 2020.11.01 |