컴퓨터과학에서 알고리즘이란
- 컴퓨터과학 = 컴퓨터 + 데이터 + 프로그램 + 알고리즘
- 컴퓨터의 한계 ≒ 알고리즘의 존재 여부
- 컴퓨터 과학 = 알고리즘 과학
기본 개념
서울에서 부산에 가려고 한다. 그러면 어떻게 갈건지에 대한 일련의 과정을 거쳐야 한다. 버스, 기차, 자차 등 교통 수단을 선택하고, 고속도로, 국도 중 어떻게 갈건지 등 많은 것을 선택하고 순서를 정해야 한다. 이처럼 아무리 간단한 문제일지라도 문제를 해결하기 위해서는 "일련의 단계적인 처리 과정"이 요구된다.
한편, 같은 문제가 발생해도, 부여되는 조건에 따라 처리 과정은 달라질 수 있다. 앞선 예에서, 짐이 많다던지, 누구와 동행해야 한다던지, 몇시까지 도착해야 하는 등 상황에 따라 방법이 달라질 수 밖에 없다.
알고리즘은 음식을 만드는 조리법에 많이 비유된다. 식재료(데이터)가 준비되면 조리법(알고리즘)을 따르면 음식이 만들어지듯 문제을 해결한 결과를 얻기 때문이다.
- 잘 알려진 "특정 문제"를 위한 알고리즘의 설계 및 분석 방법 이해
- 컴퓨터를 이용한 문제 해결 방법에 대해 체계적으로 생각하는 방법 이해
- 주어진 문제에 대한 지적 추상화 능력 및 통찰력 향상
컴퓨터과학이란
- 컴퓨터를 활용해서 주어진 문제를 해결하기 위한 학문
알고리즘이란
- 단계적인 처리 절차를 따르면 주어진 답을 구할 수 있다.
문제 사례
- 최솟값(최댓값) 찾는 문제
A[ ] = {80, 70, 40, 20, 30, 10, 60, 50}- 입력 배열 중에서 첫 번째 데이터를 최솟값(최댓값)으로 지정
- 배열에서 다음 숫자를 읽고, 이것과 저장된 초솟값(최댓값) 비교
- 비교 후 더 작은(큰) 숫자를 최솟값(최댓값)으로 다시 지정
- 배열에 처리할 데이터가 남아 있으면 2번째로 다시 시작
- 저장된 최솟값(최댓값)을 결과로 출력
- 한 점 그리기 문제(오일러 경로를 문제, 퀘닉스버그 다리 문제로 불림)
그래프의 모든 간선을 오직 한 번씩만 지나가는 경로(점의 방문은 여러 번 허용)- 오일러 경로의 존재 여부를 확인 규칙
- 각 정점의 차수(해당 정점에 부수된 간선의 개수)가 홀수인 정점이 0 이거나 2개이면 오일러 경로 존재
- 만약 홀수인 정점이 2개일 경우 반드시 홀수 정점에서 시작
- 특히 홀수 정점이 0개인 경우에는 출발점과 도착점이 같은 오일러 경로가 된다(오일러 회로)
- 홀수 정점이 2개 초과이면 오일러 경로가 존재하지 않는다.
- 오일러 경로의 존재 여부를 확인 규칙
- 최단 경로를 찾는 문제
- 하나의 출발점을 기준으로 다른 모든 정점(도시)으로의 최단 경로를 구하는 문제는 데이크스트라(다익스크라) 알고리즘으로 해결할 수 있다.
- 서울 - 천안- 논산 - 대전 - 진주 - 부산이 최단 경로이다.
- 모든 정점 쌍 간의 최단 경로, 즉 임의의 최단 경로를 찾는 문제는 플로이드 알고리즘을 적용한다.
- 하나의 출발점을 기준으로 다른 모든 정점(도시)으로의 최단 경로를 구하는 문제는 데이크스트라(다익스크라) 알고리즘으로 해결할 수 있다.
문제 풀이 과정인 알고리즘을적절한 프로그래밍 언어로 표현해서 컴퓨터가 이해하고 실행할 수 있도록 만든 "명령어의 모임"이 바로 프로그램이다.
알고리즘이란 문제 해결을 위해 따라야 할 명령어들을 단계적으로 나열한 것
알고리즘의 조건
- 입출력 : 외부에서 0개 이상의 입력을 받아서 하나 이상의 출력을 생성해야 한다.
- 명확성 : 각 명령은 모호하지 않고 단순 명확해야 한다.
- 유한성 : 한정된 수의 단계를 거친 후에는 반드시 끝나야 한다.
- 유효성 : 모든 명령은 컴퓨터에서 수행할 수 있어야 한다.
알고리즘은 주어진 문제에 대한 하나 이상의 결과를 생성하기 위해 모호하지 않고 단순 명확하며 컴퓨터가 수행할 수 있는 유한개의 일련의 명령어들을 순서에 따라 구성한 것이라고 정의할 수 있다.
an orderd set of unambiguous, executable steps that produce a result and terminates in afinite time
알고리즘이 존재한다는 것은 적어도 이론적으로는 주어진 문제의 해를 구할 수 있다는 관점에서 중요하다. 그리고 효율적이어야 한다. 현실적인 시간 내에 원하는 결과를 얻기 위해서는 효율적이어야 한다.
알고리즘 설계
- 입출력 조건과 처리 조건 등을 고려해서 문제 분석
- 알고리즘 설계 - 상향식 설계, 하향식 설계, 욕심쟁이 방법, 분할정복 방법, 동적 프로그래밍 방법 등...
- 정확성 검증 - 수학적 증명
- 효율성 분석 - 공간 복잡도, 시간 복잡
![]() |
![]() |
최솟값을 찾는 위의 두 가지 방식은 비교 횟수가 똑같다. n개의 숫자 중에서 최솟값(최댓값)을 찾기 위해서는 최소 (n-1)번의 비교가 필요하다.
조건에 따라 달라지는 알고리즘
뒤섞인 카드에서 원하는 숫자를 가진 카드를 찾는 경우
무작위 배치 | 정렬 배치 |
SequentialSearch (A[ ], n, key) 입력 A[0..n-1] : 입력 배열 n : 배열 크기(데이터 개수) key : 탐색 키(찾으려는 값) 출력 key가 배열 내에 존재하면 해당 인덱스, 아니면 n을 반환 { i = 0; while ( i < n && A[i] != key) i = i + 1; return (i); } |
BinarySearch (A[ ], key, left, right) 입력 A[left..right] : 입력 배열 key : 탐색 키 출력 key가 A[ ] 내에 존재하면 해당 인덱스, 아니면 -1을 반환 { if( left > right) return (-1); Mid = [ (left_right) / 2]; // [x]는 소수점 버림(floor 연산) if (A[Mid] == key) return (Mid); else if (key < A[Mid]) BinarySearch(A, key, left, Mid-1) else BinarySearch(A, key, Mid+1, right); } |
순차 탐색 | 이진탐색 |
- 순차 탐색
- 처음 부터 순차적으로 확인
- 운이 좋으면 처음에 발견하겠지만 최악의 경우 마지막까지 확인해야 한다.
- 이진탐색
- 주어진 배열에서 중앙 위치를 계산
- 중앙 위치의 값과 탐색 키를 비교하고 원하는 값이라면 탐색 종료
- 중앙 위치의 값이 찾는 값이 아니면 탐색 키와 중앙의 값의 크기를 비교하여 이진 탐색을 순환 호출
- 탐색 키가 중앙의 값보다 작다면 탐색 키는 정렬된 입력 배열의 왼쪽 절반 부분에 존재할 수 있으므로 배열의 왼쪽 절반 부분 A[ left .. (Mid-1)]을 다시 입력 배열로 사용해서 이진 탐색을 수행
- 탐색 키가 중앙의 값보다 크다면 배열의 오른쪽 절반인 A[ (Mid+1)..right]를 대상으로 이진 탐색을 순환 호출
알고리즘의 설계는 주어지는 문제와 조건 등에 따라 매우 다양해질 수 있으므로 모든 문제 혹은 대부분 문제에 대해서 일반적으로 적용할 수 있는 범용적인 개념의 알고리즘 설계기법은 불행하게도 존재하지 않는다.
대표적 설계기법
- 욕심쟁이 바업
- 분할정봅 방법
- 동적 프로그래밍 방법
'방통대2 > 알고리즘' 카테고리의 다른 글
1장 알고리즘 소개 (1) | 2025.01.01 |
---|