Priv's Blog
1. 알고리즘 본문
1. 알고리즘 (Algorithm)
알고리즘이란, 어떠한 문제를 해결하기 위해 정해놓은 일련의 절차를 의미한다.
알고리즘은 문제의 조건에 따라 입력과 출력을 명시할 수 있어야 한다.
올바른 알고리즘은 어떠한 경우에도 실행 결과가 동일하게 나오는 알고리즘을 말한다.
1.1) 순차 구조 (Sequential Structure)
한 문장씩 순서대로 처리되는 구조를 순차 구조라고 부른다.
일반적인 프로그램들은 대부분 위에서 아래로 순차적으로 실행되는 구조를 지니고 있다.
1.2) 선택 구조 (Select Structure)
조건식을 사용하여 평가한 결과에 따라 프로그램의 실행 흐름이 변경되는 구조를 선택 구조라고 부른다.
일시적으로 실행 흐름이 변경될 수는 있으나, 전체 프로그램의 흐름에서 완전히 이탈하지는 않는다.(Ex. 조건식)
1.3) 조건문과 분기
분기(branching)란, 프로그램의 실행 흐름을 다른 곳으로 변경하는 명령을 의미한다.
입력받은 정수 값의 부호를 판단해 출력하는 프로그램의 조건문과 분기를 살펴보자.
num = int(input("정수 입력: ")
if (num > 0) :
print("양수")
if (num < 0) :
print("음수")
else :
print("0")
조건문을 보면 알 수 있듯이, 프로그램의 전체 흐름이 3개로 분기된다.
조건문의 구성에 따라 분기의 수를 잘 살펴야 한다.
else 문이 생략해 조건문을 작성하였다고 해도, else 문의 동작도 분기에 포함되기 때문이다.
n = int(input("정수 입력: ")
if (n == 1) :
print("A")
elif (n == 2) :
print("B")
else :
print("C")
위 코드는 n의 값이 1, 2가 아니라면 모두 c를 출력하는 조건문이다.
이는 흐름이 총 3개로 분기된다.
n = int(input("정수 입력: ")
if (n == 1) :
print("A")
elif (n == 2) :
print("B")
elif (n == 3) :
print("C")
위 코드는 1, 2, 3이 아니면 아무것도 출력하지 않는 조건문이다.
코드 상에는 else 문이 빠져 있지만, 실제로는 n이 1, 2, 3인 경우의 분기 3개와 1, 2, 3이 아닐 경우의 분기 1개로 이루어진 조건문이다.
즉, 위 코드의 흐름은 총 4개로 분기된다.
1.4) 순서도 (flowchart)
순서도란, 문제를 정의/분석하고 해결하는 방법을 표현한 그림을 의미한다.
순서도는 다양한 기호들로 구성되는데, 이는 다음과 같다.
2. 세 정수의 최댓값 구하기
a, b, c 변수에 3개의 정수를 입력받아 최댓값을 구하는 알고리즘을 구현해보자.
def max3(a, b, c) :
maxx = a ## Initial
## Finding a max num ##
if (b > maxx) :
maxx = b
if (c > maxx) :
maxx = c
## -- ##
print(f'Max num is {maxx}') ## Result
print('Find a max num of 3 int var')
## User Input ##
a = int(input('Input a int num of var a: ')
b = int(input('Input a int num of var b: ')
c = int(input('Input a int num of var c: ')
## -- ##
max3(a, b, c) ## Funtion Call
2.1) 결정 트리(decision tree)
결정 트리란, 알고리즘의 모든 경우의 수를 따져서 마주하는 조건식의 결과가 참이면 검은선을, 거짓이면 파란선을 따라가며 최종 결과 값을 찾아내도록 구성된 트리이다.
위의 세 정수의 최댓값 탐색 알고리즘을 결정 트리로 구현해보면 다음과 같다.
3. 세 정수의 중앙값 구하기
세 정수의 최댓값 구하기 알고리즘을 응용하여 세 정수의 중앙값을 구해보자.
def med3(a, b, c) :
if (a >= b) :
if (b >= c) :
return b :
elif (a <= c) :
return a
else :
return c
elif (a > c) :
return a
elif (b > c) :
return c
else :
return b
print('Find a med num of 3 int var')
## User Input ##
a = int(input('Input a int num of var a: ')
b = int(input('Input a int num of var b: ')
c = int(input('Input a int num of var c: ')
## -- ##
med3(a, b, c) ## Funtion Call
세 정수의 중앙값 구하기 위해 판별해야 하는 조건을 모두 나열해보면 다음과 같이 정리해볼 수 있다.
- (b >= a >= c), (c >= a >= b)
- (a > b > c), (c > b > a)
- (a > c > b), (b > c > a)
이 조건들을 활용하면 코드의 복잡도를 크게 줄일 수 있다.
다음 코드를 살펴보자.
def med3(a, b, c) :
if (b >= a and c <= a) or (b <= a and c >= a) :
return a
elif (a > b and c < b) or (a < b and c > b) :
return b
return c
print('Find a med num of 3 int var')
## User Input ##
a = int(input('Input a int num of var a: ')
b = int(input('Input a int num of var b: ')
c = int(input('Input a int num of var c: ')
## -- ##
med3(a, b, c) ## Funtion Call
if 문의 사용을 줄이는 대신, 논리 연산자를 사용하였다.
수고하셨습니다!
'Dev. Study Note > Algorithm (Python)' 카테고리의 다른 글
6. 리스트와 튜플 (0) | 2022.01.11 |
---|---|
5. 배열 (0) | 2022.01.07 |
4. Python 변수 (0) | 2022.01.04 |
3. 자료구조와 배열 (0) | 2022.01.03 |
2. 반복 알고리즘 (0) | 2021.12.30 |