본문 바로가기

About my life/Development Studies

[Algorithm] 초보자를 위한 알고리즘 이해 가이드: 알고리즘의 핵심

728x90
반응형
알고리즘이란 ?

알고리즘은 주어진 문제를 해결하기 위한 일련의 명령어나 규칙들의 집합입니다. 이를 통해 컴퓨터는 특정한 작업을 수행하거나 원하는 결과를 얻을 수 있습니다. 예를 들어, 배열에서 특정 값을 찾거나 정렬된 리스트에서 삽입 정렬을 수행하는 것이 알고리즘의 일종입니다.

알고리즘의 특성과 종류

  • 입력과 출력: 알고리즘은 입력을 받아서 원하는 출력을 생성하는 과정을 포함합니다. 예를 들어, 정수 배열이 주어졌을 때 최댓값을 찾는 알고리즘은 배열을 입력으로 받아 최댓값을 출력합니다.
  • 유한성: 알고리즘은 유한한 단계를 거쳐 결과를 도출해야 합니다. 무한 루프에 빠지면 안 됩니다.
  • 자명성: 각 단계는 명확하게 정의되어야 하며, 모호하지 않아야 합니다.
  • 효과성: 모든 단계는 실행 가능한 시간 내에 완료되어야 합니다.

정렬 알고리즘: 버블 정렬 예시

  • 개념: 인접한 두 원소를 비교하여 순서에 맞지 않으면 서로 교환하는 방식으로 정렬하는 알고리즘입니다.
  • 동작 과정:
    1. 배열의 첫 번째 원소부터 마지막 원소까지 반복합니다.
    2. 현재 원소와 다음 원소를 비교하여 순서가 반대이면 교환합니다.
    3. 마지막 원소까지 이동한 후, 가장 큰 원소가 마지막 자리로 이동합니다.
    4. 위의 과정을 반복하면서 정렬이 완료됩니다.
  • 시간 복잡도: O(n^2)로 비효율적이나 간단한 구현으로 이해하기 용이합니다.

검색 알고리즘: 이진 탐색

  • 개념: 정렬된 배열에서 특정 값을 찾는 알고리즘으로, 중간값을 기준으로 찾고자 하는 값이 왼쪽 또는 오른쪽에 있음을 판단하여 반씩 범위를 줄여가는 방식입니다.
  • 동작 과정:
    1. 배열의 중간 값을 선택합니다.
    2. 중간 값이 찾고자 하는 값과 같으면 검색을 종료합니다.
    3. 중간 값이 찾고자 하는 값보다 크면 왼쪽 부분 배열에서 검색을 수행합니다.
    4. 중간 값이 찾고자 하는 값보다 작으면 오른쪽 부분 배열에서 검색을 수행합니다.
    5. 찾을 때까지 이 과정을 반복합니다.
  • 시간 복잡도: O(log n)으로 효율적이며, 배열이 정렬되어 있어야 합니다.

 

그래프 알고리즘: 깊이 우선 탐색(DFS)

  • 개념: 그래프의 모든 정점을 방문하고자 할 때 사용되는 알고리즘으로, 한 정점에서 시작하여 최대한 깊게 들어가면서 탐색하는 방식입니다. 그래프나 트리에서 한 경로를 끝까지 탐색한 후 다른 경로로 탐색하는 알고리즘입니다. 스택 또는 재귀 함수를 통해 구현할 수 있습니다.
  • 동작 과정:
    1. 시작 정점을 방문하고, 방문한 정점을 방문한 표시를 합니다.
    2. 현재 정점과 연결된 정점 중에서 방문하지 않은 정점이 있으면 그 정점을 시작 정점으로 삼아 재귀적으로 탐색합니다.
    3. 모든 정점을 방문할 때까지 위의 과정을 반복합니다.
  • 응용 예시: 그래프 순회, 신장 트리 찾기, 연결 요소 확인 등 다양한 그래프 문제에 활용됩니다.

힙(Heap) 알고리즘:

  • 개념: 완전 이진 트리 형태로 구성된 자료구조로, 최댓값이나 최솟값을 빠르게 찾기 위해 사용됩니다.
  • 종류:
    • 최소 힙(Min Heap): 부모 노드의 값이 자식 노드의 값보다 항상 작은 힙.
    • 최대 힙(Max Heap): 부모 노드의 값이 자식 노드의 값보다 항상 큰 힙.
  • 활용 예시: 우선순위 큐, 다익스트라 알고리즘 등에서 사용됩니다.

퀵소트(Quicksort) 알고리즘:

  • 개념: 분할 정복 기법을 사용하여 리스트를 정렬하는 알고리즘으로, 평균적으로 O(n log n)시간 복잡도를 가집니다.
  • 동작 과정:
    1. 리스트에서 피벗(pivot)을 선택하고, 피벗을 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할합니다.
    2. 분할된 부분 리스트에 대해 재귀적으로 퀵소트를 수행합니다.
    3. 정렬이 완료되면 모든 부분 리스트를 합칩니다.
  • 특징: 빠른 정렬 속도로 널리 사용되며, 공간 복잡도가 상대적으로 낮습니다.
  • 참고: 분할 정복(Divide and Conquer)은 큰 문제를 작은 부분 문제로 나누어 해결하는 알고리즘 설계 기법입니다. 

동적 프로그래밍(Dynamic Programming):

  • 개념: 큰 문제를 작은 하위 문제로 나누어 해결하고, 그 결과를 저장하여 중복 계산을 피하는 알고리즘입니다.
  • 응용 예시: 최장 증가 부분 수열 찾기, 행렬 곱셈 순서 최적화 등에 사용됩니다.
    • 예시: 피보나치 수열
      • 재귀적으로 피보나치를 계산하면 중복 계산이 많이 발생합니다.
      • 동적 계획법을 사용하여 중복 계산을 피하고 계산한 결과를 저장합니다.
      • 시간 복잡도: O(n)으로 효율적으로 문제를 해결할 수 있습니다.

다익스트라(Dijkstra) 알고리즘:

  • 개념: 단일 시작점에서 모든 다른 노드까지의 최단 경로를 찾기 위해 사용되는 그래프 알고리즘입니다.
  • 동작 과정:
    1. 시작 노드의 최단 거리를 0으로 초기화하고, 나머지 노드의 최단 거리를 무한대로 설정합니다.
    2. 현재까지의 최단 거리와 연결된 노드를 통해 더 짧은 경로를 찾으면 업데이트합니다.
    3. 모든 노드에 대해 최단 거리를 찾을 때까지 반복합니다.
  • 응용 예시: 네트워크 라우팅, GPS 기반 경로 탐색 등에서 사용됩니다.

트리 순회 알고리즘:

  • 전위 순회(Preorder), 중위 순회(Inorder), 후위 순회(Postorder): 이진 트리의 노드를 방문하는 순서에 따라 순회하는 알고리즘으로, 각각 노드를 먼저, 중간에, 나중에 방문하는 방식입니다.
  • 응용 예시: 이진 트리의 구조 파악, 식 트리의 계산 등에서 사용됩니다.

A* 알고리즘 (A-star Algorithm):

  • 개념: 최단 경로를 찾는 데에 사용되는 그래프 탐색 알고리즘으로, 효율적으로 동작하면서도 휴리스틱 함수를 활용하여 최적 경로를 탐색합니다.
  • 동작 과정:
    1. 각 노드의 비용과 휴리스틱 값을 이용하여 우선순위 큐에 노드를 저장합니다.
    2. 시작 노드에서부터 현재까지의 비용과 휴리스틱 값을 사용하여 다음 노드를 선택합니다.
    3. 목적지에 도달하면 탐색을 종료합니다.
  • 응용 예시: 길 찾기, 로봇의 경로 계획 등에 활용됩니다.

탐욕 알고리즘(Greedy Algorithm):

  • 개념: 각 단계에서 지금 당장 가장 좋은 선택을 하는 알고리즘으로, 각 선택이 전체적인 최적해로 이어지는 경우에 사용됩니다.
  • 예시: 거스름돈 문제
    • 지불해야 할 돈이 정해져 있을 때, 최소한의 동전 개수로 거스름돈을 주는 문제를 해결할 때 사용할 수 있습니다.
    • 가장 큰 단위의 동전부터 선택하여 최적해를 찾습니다.

 

이 밖에도 정말 많은 알고리즘이 존재한다.

알고리즘의 정의에 따라서 이해하면 알고리즘이 조금 쉬워지는 것 같다.

결국 가장 중요한 것은 특정 인풋을 통해 어떤 아웃풋을 기대할 것인가 ?

기대한 아웃풋을 만들기 위해 사용하는 것이 알고리즘이다.

따라서 알고리즘은 어떤 도메인에서도 정말 많이 존재할 것이고, 
그 어떠한 도메인에서도 필요할 것이다.

알고리즘을 공부하기 위해서는 다음과 같은 순서로 이해하면 좋을 것 같다.

1. 인풋의 종류
2. 기대하는 아웃풋
3. 어떤 목적으로 사용되는 가
4. 알고리즘의 논리 과정

모두들 알고리즘을 정복하시길 바랍니다.

알고리즘을 학습할 때 참고사항:

알고리즘을 효과적으로 익히기 위해선 이론뿐만 아니라 실습이 필요합니다. 온라인 저지(Online Judge) 플랫폼에서 알고리즘 문제를 풀며, 다양한 알고리즘의 적용과 응용을 경험해보세요. LeetCode, HackerRank, Baekjoon Online Judge 등이 유용한 플랫폼 중 하나입니다.

알고리즘은 자료구조와 깊게 연관되어 있습니다. 효과적인 알고리즘을 설계하고 구현하기 위해서는 어떤 자료구조를 사용할지에 대한 이해가 필수적입니다. 예를 들어, 특정 문제에 대해 어떤 자료구조를 선택하는 것이 효율적인지 고민해보고 이를 활용하여 알고리즘을 개발해보세요.


알고리즘을 작성한 후에는 해당 알고리즘의 성능을 분석하고 최적화하는 작업이 중요합니다. Big-O 표기법을 사용하여 알고리즘의 시간 복잡도를 계산하고, 필요한 경우에는 성능을 향상시키는 최적화를 수행하세요. 이를 통해 실제 환경에서도 효과적으로 사용할 수 있는 알고리즘을 개발할 수 있습니다.

 

728x90
반응형