본문 바로가기

Computer Science/Algorithm

<알고리즘> 알고리즘 기초

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입니다.

 

 - 위는 의도적으로 무한루프를 생성하였다.

 - 무한루프를 빠져나오려면 n10이상 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! 자료구조와 함께 배우는 알고리즘 입문 - 파이썬 편

 

http://www.easyspub.co.kr/20_Menu/BookView/381/PUB

 

www.easyspub.co.kr

 

이지스퍼블리싱 스터디룸 카페

 

Do it! 스터디룸 : 네이버 카페

Do it!, 된다 시리즈 책으로 함께 공부하고 서로 돕는 사람들을 만나 보세요. python, C, java, Android

cafe.naver.com

 

교재 공식 깃허브

 

easysIT/doit_dsalgo_with_python

Do it! 자료구조와 함께 배우는 알고리즘 파이썬 편. Contribute to easysIT/doit_dsalgo_with_python development by creating an account on GitHub.

github.com