알고리즘이란?
알고리즘은 어떤 문제를 해결하기 위해 정해진 순서대로 실행하는 명확한 절차입니다. 좋은 알고리즘은 단순히 코드가 실행되는 것뿐만 아니라, 반드시 일정한 조건을 만족해야 합니다.
입력 Input
의미: 알고리즘은 문제 해결에 필요한 값을 0개 이상 입력받을 수 있어야 합니다.
입력은 사용자가 직접 넣을 수도 있고, 이미 정해진 데이터일 수도 있습니다.
좋은 예 : 두 수를 입력받아 합 구하기
a = int(input("첫 번째 숫자 입력: "))
b = int(input("두 번째 숫자 입력: "))
result = a + b
print("두 수의 합:", result)
이 코드는 사용자가 입력한 두 수를 받아서 계산하므로 입력 조건을 만족합니다.
코드 설명
input(): 사용자로부터 값을 입력받습니다.int(): 입력받은 문자열을 정수로 바꿉니다.a + b: 두 수를 더합니다.
출력 Output
의미: 알고리즘은 문제를 해결한 뒤 최소 1개 이상의 결과를 출력해야 합니다.
출력이 없다면 계산을 해도 결과를 확인할 수 없습니다.
좋은 예 : 평균 출력하기
score1 = 80
score2 = 90
score3 = 100
average = (score1 + score2 + score3) / 3
print("평균 점수:", average)
print()를 사용하여 평균 점수를 보여 주므로 출력 조건을 만족합니다.
나쁜 예 : 계산만 하고 출력하지 않음
score1 = 80
score2 = 90
score3 = 100
average = (score1 + score2 + score3) / 3
평균을 계산했지만 결과를 출력하지 않기 때문에 사용자가 결과를 확인할 수 없습니다.
명확성 Definiteness
의미: 알고리즘의 각 단계는 모호하지 않고 분명하게 정의되어야 합니다.
누가 실행해도 같은 방식으로 이해할 수 있어야 합니다.
좋은 예 : 짝수와 홀수 판별
num = 7
if num % 2 == 0:
print("짝수입니다.")
else:
print("홀수입니다.")
num % 2 == 0이라는 조건이 명확하므로 결과가 분명하게 결정됩니다.
나쁜 표현
# num이 적당히 큰 수이면 출력한다.
# num이 괜찮은 수이면 통과시킨다.
“적당히”, “괜찮은” 같은 표현은 기준이 불분명하므로 알고리즘의 명확성을 만족하지 못합니다.
유한성 Finiteness
의미: 알고리즘은 반드시 한정된 단계 안에서 종료되어야 합니다.
끝나지 않는 절차는 결과를 얻을 수 없기 때문에 좋은 알고리즘이 아닙니다.
좋은 예 : 5번만 반복하기
for i in range(1, 6):
print(i)
range(1, 6)은 1부터 5까지만 반복하므로 반드시 종료됩니다.
나쁜 예 : 무한 반복
while True:
print("계속 반복됩니다.")
종료 조건이 없으므로 프로그램이 계속 실행됩니다. 따라서 유한성을 만족하지 못합니다.
유효성 Effectiveness
의미: 알고리즘의 각 단계는 실제로 수행할 수 있는 기본적이고 실행 가능한 연산이어야 합니다.
컴퓨터가 처리할 수 없는 모호하거나 불가능한 명령은 유효하지 않습니다.
좋은 예 : 나눗셈의 몫과 나머지 구하기
x = 17
y = 5
quotient = x // y
remainder = x % y
print("몫:", quotient)
print("나머지:", remainder)
//와 %는 파이썬에서 실제로 수행 가능한 연산이므로 유효성을 만족합니다.
나쁜 표현
# 컴퓨터가 알아서 가장 완벽한 답을 상상해서 구한다.
# 순간이동해서 정답을 가져온다.
이런 명령은 컴퓨터가 실제로 실행할 수 없으므로 유효성을 만족하지 못합니다.
5가지 조건을 모두 만족하는 파이썬 알고리즘
다음 코드는 정수 하나를 입력받아 그 수가 소수인지 판별합니다.
n = int(input("정수 입력: "))
if n < 2:
print("소수가 아닙니다.")
else:
is_prime = True
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
is_prime = False
break
if is_prime:
print("소수입니다.")
else:
print("소수가 아닙니다.")
| 조건 | 코드에서 확인되는 부분 |
|---|---|
| 입력 | input()으로 정수 입력 |
| 출력 | print()로 결과 출력 |
| 명확성 | n % i == 0처럼 판단 기준이 분명함 |
| 유한성 | for 반복 범위가 정해져 있음 |
| 유효성 | 나머지 연산, 비교 연산 등 실제 실행 가능 |
OX 문제
1. 알고리즘은 반드시 출력이 있어야 한다. ( O / X )
2. 무한 반복되는 프로그램도 항상 좋은 알고리즘이다. ( O / X )
3. “적당히 계산한다”라는 표현은 명확한 알고리즘 단계이다. ( O / X )
4. print()는 출력 조건과 관련이 있다. ( O / X )
print()는 결과를 화면에 보여 주는 출력 명령입니다.5. 컴퓨터가 실제로 수행할 수 없는 명령은 유효성을 만족하지 못한다. ( O / X )