찬환
천천히 꾸준하게
찬환
전체 방문자
오늘
어제
  • 분류 전체보기 (19)
    • Problem Solving (2)
      • BOJ (2)
    • Algorithm (3)
    • Java (1)
    • CS (7)
      • 컴퓨터구조 (3)
      • 운영체제 (2)
      • 데이터베이스 (2)
    • Web (0)
    • Spring (1)
    • Git (2)
    • 북스터디 (2)
      • 이펙티브 자바 (2)
    • Tech Stack (0)
    • 끄적끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Arrays메서드
  • BOJ
  • Key의 종류
  • 정적팩터리메서드
  • Spring Ecosystem
  • java.util.arrays
  • git flow
  • 삼성SW역량
  • cs
  • 삼성 B형
  • B형 후기
  • backtracking
  • 폰노이만구조
  • 컨텍스트_스위칭
  • Arrays정리
  • effective_java
  • 빌더패턴
  • 이펙티브자바
  • BOJ_2580
  • ITEM_2
  • 운영체제
  • 주사위굴리기
  • Boj_14499
  • Udacity_git_commit_message_style_guide
  • 컴퓨터의_구성요소
  • SpringBoot
  • 프로세스_메모리_구조
  • 이펙티브 자바
  • 알고리즘
  • 브랜치 전략

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
찬환

천천히 꾸준하게

Algorithm

[알고리즘] 그리디 알고리즘의 특징과 그리디 구분법

2023. 2. 17. 09:29
728x90

그리디 알고리즘 특징

  • 그리디 알고리즘은 최적해를 구하는 데 사용되는 근시안적인 방법이다.
  • 최적화 문제(optimization)란 가능한 해들 중에서 가장 좋은(최대 또는 최소) 해를 찾는 문제이다.
  • 일반적으로, 머리 속에 떠오르는 생각을 검증 없이 바로 구현하면 Greedy 접근이 된다.
  • 여러 경우 중 하나를 선택 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다.
  • 각 선택 시점에서 이루어지는 결정은 지역적으로는 최적이지만, 그 선택들을 계속 수집하여 최종적인 해답을 만들었다고 하여, 그것이 최적이라는 보장은 없다.
  • 일단, 한번 선택된 것은 번복하지 않는다. 이런 특성 때문에 대부분의 탐욕 알고리즘들은 단순하며, 또한 제한적인 문제들에 적용된다.

 

그리디가 가능한 경우 판단 - 거스름돈 줄이기 문제

물건 값이 1200원이고, 받은 돈이 2000원이라면 800원을 거슬러줘야 할 것이다.

위 문제의 거스름돈의 개수를 줄이기 위해 아래 두 가지의 화폐 단위가 있다고 해보자.

  1. 500원, 100원, 50원, 10원
  2. 500원, 400원, 100원, 50원, 10원

1번의 경우에는 그리디가 가능하지만, 2번의 경우는 그리디로 풀 수 없다.

왜 그럴까?

그리디로 풀기 위해서는 하나의 문제를 다른 부분 문제로 풀 수 있어야 한다.

 

1번의 경우

500원은 100원 5개, 50원 10개, 10원 50개로 만들 수 있다.

100원의 경우 50원 2개, 10원 10개로 만들 수 있다.

50원의 경우 10원 5개로 만들 수 있다.

 

2번의 경우

400원, 100원, 50원, 10원의 경우 각각 하위 문제로 만들 수 있지만,

500원의 경우 100원, 50원, 10원으로는 만들 수 있지만 400원을 여러 개 모아도 500원을 만들 수 없다.

따라서 2번의 경우는 그리디로 풀 수 없는 문제가 된다.

 

그리디의 필수 요소

탐욕적 선택 속성

  • 탐욕적 선택은 최적해로 갈 수 있음을 보여야 한다

최적 부분 구조

  • 최적화 문제를 정형화하라
    • 하나의 선택을 하면 풀어야 할 하나의 하위 문제가 남는 것이 보장되어야 한다.

따라서, 원 문제의 최적해 = 탐욕적 선택 + 하위 문제의 최적해 임을 증명해야 한다.

 

마치며

동전 거스름 문제나 프림, 크루스칼, 다익스트라와 같이 잘 알려진 그리디 문제가 아니라면 알고리즘 문제에서 그리디를 판단하는 것은 쉽지 않은 것 같다.

그리디라는 것을 알기만 한다면 쉽게 코드를 짤 수 있는 만큼 여러가지 그리디 문제의 유형을 파악하고 있을 필요가 있어 보인다.

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[자료구조] 그래프란? 개념과 표현 방법  (0) 2023.02.22
[알고리즘] 백트래킹 해결 방법과 예시 문제  (0) 2023.02.21
    'Algorithm' 카테고리의 다른 글
    • [자료구조] 그래프란? 개념과 표현 방법
    • [알고리즘] 백트래킹 해결 방법과 예시 문제
    찬환
    찬환
    공부한 내용을 포스팅하는 IT 기술블로그입니다.

    티스토리툴바