[Algorithm/Greedy] About 그리디 알고리즘

2024. 7. 3. 22:02·Computer Science/Algorithm

그리디 알고리즘(greedy algorithm)이란?

  • 알고리즘 설계 패러다임 중 하나로, 매 단계에서 '가장 좋아 보이는' 해답을 선택하는 알고리즘이다.
  • 매 단계마다 전체적으로 최적인지는 판단하지 않고 현재 최적이라고 판단되는 결정을 함. 즉 과거(이전 선택)나 미래(앞으로의 선택)는 생각하지 않고, 오직 현재의 최대 만족만을 추구. (근시안적 선택)
  • 그리디 방법은 지역적인 최적의 해결 방법으로부터 전역적인 최적의 해결 방법을 구성하는 방식이다.

 

 

Example) 지도

 

지도 서비스에서 두 지점의 최단 이동 경로 기능을 제공한다

이 때, 출발 지점에서 아직 방문하지 않은 가장 가까운 지점까지의 경로를 찾고, 이를 목적 지점에 다다를 때 까지 반복하여 경로를 구한다.

(다익스트라 알고리즘의 기본 개념)

 

  • 그리디 접근 방식은 너무 단순하기 때문에 몇몇 알고리즘 문제에만 적용할 수 있다.
    • 그러나 이런 단순함은 문제 해결을 위한 첫 걸음이 될 수 있다.
    • 이를 통해 주어진 문제의 속성과 행동을 이해하고, 이후 다른 복잡한 방법을 이용해 문제를 해결할 수 있다.

그리디 알고리즘은 언제 적용할 수 있나요?

  • 최적 부분 구조 속성과 그리디 선택 속성을 모두 만족해야 그리디 방법으로 최적의 솔루션을 구할 수 있다.
    • 최적 부분 구조(optimal substructure) : 주어진 문제 P에 대한 최적의 솔루션이 P의 부분 문제들의 최적의 솔루션으로 구성될 경우, 문제 P가 최적의 부분 구조를 갖는다고 말한다
      • 문제의 최적해가 부분제들의 최적해로부터 효율적으로 생성됨을 의미함
    • 그리디 선택 (greedy choice) : 주어진 문제 p에 대한 지역적 최적 솔루션을 반복적으로 선택하여 전체 최적 솔루션을 구할 수 있는 경우 문제 P가 그리디 선택 속성을 갖는다고 말한다.
      • 앞의 선택이 이후의 선택에 영향을 주지 않는다는 것을 의미
  • 위 속성을 확인할 수 있는 좋은 예시로는 크루스칼 최소 신장 트리 알고리즘이 있다.(다다음? 게시글에서 다룰 예정)

Ref) 코딩 테스트를 위한 자료 구조와 알고리즘 with C++

Ref) 알기 쉬운 알고리즘

'Computer Science > Algorithm' 카테고리의 다른 글

[Algorithm/Greedy] 배낭 문제(knapsack problem)  (0) 2024.07.03
[Algorithm/Greedy] 최단 작업 우선 스케줄링(shortest-job-first scheduling)  (0) 2024.07.03
[Algorithm/Divide&Conquer] 10. 거듭 제곱 계산법  (0) 2024.07.02
[Algorithm/Divide&Conquer] 09. 분할 정복을 적용하는데 있어서 주의할 점  (0) 2024.07.02
[Algorithm/Divide&Conquer] 08. L-트로미노 타일링  (0) 2024.07.02
'Computer Science/Algorithm' 카테고리의 다른 글
  • [Algorithm/Greedy] 배낭 문제(knapsack problem)
  • [Algorithm/Greedy] 최단 작업 우선 스케줄링(shortest-job-first scheduling)
  • [Algorithm/Divide&Conquer] 10. 거듭 제곱 계산법
  • [Algorithm/Divide&Conquer] 09. 분할 정복을 적용하는데 있어서 주의할 점
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Algorithm/Greedy] About 그리디 알고리즘
상단으로

티스토리툴바