[Algorithm] 그리디(Greedy) 알고리즘

2024. 10. 31. 08:57·코딩테스트/알고리즘
목차
  1. 개요
  2. 그리디 알고리즘
  3. 그리디 알고리즘 필요 조건
  4. 예시 문제
  5. 결론
728x90
반응형

개요

최근 게임 회사 코딩테스트를 몇 번 경험해보니 그리디 알고리즘에 관한 문제가 적어도 1문제 이상 출시되었고, 많은 어려움이 있었기에 이번 포스팅에서는 그리디 알고리즘에 대해 자세히 정리해보도록 하겠습니다.


그리디 알고리즘

그리디 알고리즘(탐욕 알고리즘, Greedy Algorithm)은 매 순간 최선의 선택을 하여 문제를 해결하는 방법론입니다.

 

문제 해결 과정에서 한 번의 선택이 이후의 선택에 영향을 주기 때문에, 순간의 최적 선택이 결국 전체 문제의 최적 해답이 될 수 있다고 가정합니다.

 

즉, 각 단계에서 당장 최적인 해를 선택하고, 최종적으로 이러한 선택들이 모여 전체 문제의 최적 해답을 구성하는 방식입니다.


그리디 알고리즘 필요 조건

그리디 알고리즘을 사용하기 위해서는 다음의 두 가지 조건을 만족해야 합니다.

  • 탐욕적 선택 : 각 단계의 선택이 이후 단계의 선택에 영향을 미치지않아야 합니다.
  • 최적 부분 구조 : 문제의 최적 해가 부분 문제의 최적 해를 포함해야 합니다.

위의 조건을 만족하지 않는 문제인 경우 그리디 알고리즘이 최적의 해를 보장하지 못할 수 있으므로, DP 등 다른 방법을 고려해야 합니다. 저는 문제를 보면 무식하게 풀기(완탐) - DP - 그리디 순으로 생각합니다.


예시 문제

그리디 알고리즘의 대표적인 예시 문제는 "거스름돈"문제입니다.

 

문제 : 일정한 금액을 거슬러 주기 위해 최소한의 동전 개수를 사용하는 방법을 찾아보세요.

명제 : 가장 큰 가치의 동전부터 순서대로 선택하여 금액을 채우면 최소 동전 개수를 사용할 수 있습니다.

 

예를 들어 5300원이라는 돈을 거슬러줘야 한다고 생각해보도록 하겠습니다.

종류가 5000, 1000, 500, 100, 10원이 있다고 가정했을 때 최적의 해는 (5000 * 1) + (100 * 3) 입니다.

 

위 문제를 보고 단계별로 나눠보면 다음과 같습니다. (최적 부분 구조)

  1. 가장 큰 화폐 단위부터 선택하여 부분 문제로 나누기
  2. 선택된 화폐를 사용하고 남은 금액을 다음 단계의 문제로 넘기기
  3. 1~2를 남은 금액이 0이 될 때까지 반복하며 전체 문제에 대한 최적 해를 찾기

위 문제를 풀기 위한 명제를 세우는 방법은 결국 경험에 의한 생각입니다. 즉, "가장 큰 가치의 동전부터 순서대로 선택하면 가장 적은 개수의 동전을 구할 수 있겠다." 라는 명제를 생각하고 실제로 값을 대입해보며 어느정도 맞는다고 생각이 되면 실제 문제 풀이를 진행하면 됩니다.

 

만약 답이 틀리다면 다시 처음 명제로 돌아와 명제를 수정해주는 방식으로 문제를 해결해 나가는 방식의 알고리즘이 그리디(탐욕) 알고리즘입니다.


결론

그리디 알고리즘은 문제를 푸는 데 있어 간단하고 빠르게 답을 구할 수 있는 방법입니다. 다만, 모든 경우에 최적의 해답을 보장하지 않으므로 문제의 조건을 잘 살피는 것이 중요합니다.

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 > 알고리즘' 카테고리의 다른 글

[Algorithm] 10진수를 2진수로 변환하기  (0) 2024.08.26
[Algorithm] 에라토스테네스의 체 (소수 판별)  (0) 2024.07.30
  1. 개요
  2. 그리디 알고리즘
  3. 그리디 알고리즘 필요 조건
  4. 예시 문제
  5. 결론
'코딩테스트/알고리즘' 카테고리의 다른 글
  • [Algorithm] 10진수를 2진수로 변환하기
  • [Algorithm] 에라토스테네스의 체 (소수 판별)
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    fsoftobjectpath
    프로그래머스
    CS지식
    unrealengine
    tsoftobjectptr
    구현
    pcce 기출문제
    Summer/Winter Coding
    Unreal Engine
    2019 kakao
    project t.a develop
    2022 kakao
    issac3d
    청년취업사관학교
    프로세스
    sesac
    백준
    fruitspuzzle
    프로젝트
    Algorithm
    timelessadventure
    delegate
    코딩테스트
    C++
    2018 kakao
    c#
    unity
    후기
    dataasset
    ai controller
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[Algorithm] 그리디(Greedy) 알고리즘

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.