탐욕법 (Greedy Method)

2022. 10. 17. 16:39·알고리즘 (with JAVA)/기본 알고리즘

1. 개념

- 알고리즘에서의 탐욕법은 우리가 원하는 답을 얻기 위해서 재귀 호출과 똑같이 여러 개의 조각으로 쪼갠 후

각 단계마다 답의 한 부분을 만들어 간다는 점이다.

( 이 부분은 완전 탐색과 DP(동적계획법)와 똑같다. )

 

-  모든 선택지를 고려해 보고 그중 전체 답이 가장 좋은 것을 찾는 완전 탐색과 DP(동적계획법)와는 달리, 탐욕법을

사용하는 알고리즘은 지금 바로 가장 좋은 방법만을 선택한다.

 

 

 

 

2. 이해하기

- 예를 들어, 외판원 문제에서 사용한 DP(동적계획법)는 다음에 도착할 수 있는 도시들을 하나하나 검사해 보고,

남은 도시들을 모두 순회하는 데 필요한 거리의 합을 최소화하는 답을 찾았지만, 탐욕적인 알고리즘은 당장

다음 도시까지의 거리만을 최소화한다.

 

- 그러므로, 탐욕적인 알고리즘은 많은 경우 최적해를 찾지 못한다.

 

 

- 따라서 탐욕적인 알고리즘이 사용되는 경우는 크게 두 가지로 제한한다.

1 탐욕법을 사용해도 항상 최적해를 구할 수 있는 문제를 만난 경우,
탐욕법은 동적 계획법보다 수행 시간이 훨씬 빠르다.
2 시간이나 공간적 제약으로 인해 다른 방법으로 최적해를 찾기 너무 어렵다면 최적해 대신
적당히 괜찮은 답(근사해)을 찾는 것으로 타협할 수 있다.

그러므로 최적은 아니지만 임의의 답보다는 좋은 답을 구하는 용도로 유용하게 쓰인다.

 

- 탐욕적인 알고리즘은 주로 1번째 용도로만 사용된다.

 

- 실제로 2번째 근사해를 구하는 문제는 대개 없을 뿐더러 존재하여도 나중에 배울 조합 탐색이나 메타휴리스틱

알고리즘들이 더 좋은 답을 주는 경우가 많기 때문이다.

 

- 탐욕적인 알고리즘은 개념은 간단하지만 한 문제를 탐욕적으로 해결하는 방법이 한 가지만 있는 것이 아닌

경우가 많고 이 중 어느 방법을 선택해야 최적해를 구할 수 있을지를 알아내기 힘들기 때문이다.

 

- 그러므로'탐욕적인 알고리즘은 문제를 해결할 때 알고리즘의 정답성을 증명하는 과정을 빼먹지 않고

연습하는 것이 좋다.

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 기본 알고리즘' 카테고리의 다른 글

선택 정렬 (Selection Sort)  (0) 2023.04.27
퀵 정렬 (Quick Sort)  (0) 2023.04.27
거품 정렬 (Bubble Sort)  (0) 2023.04.27
안정 정렬과 불안정 정렬  (0) 2023.04.27
동적 계획법  (0) 2022.09.26
'알고리즘 (with JAVA)/기본 알고리즘' 카테고리의 다른 글
  • 퀵 정렬 (Quick Sort)
  • 거품 정렬 (Bubble Sort)
  • 안정 정렬과 불안정 정렬
  • 동적 계획법
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      serializable
      자바 개념
      코딩테스트
      안정 정렬
      다형성
      문자 기반 스트림
      소켓 프로그래밍
      유용한 클래스
      InputStream
      TCP 소켓 프로그래밍
      불안정 정렬
      중간연산
      java.time 패키지
      file
      ServerSocket
      선택 정렬
      제자리 정렬
      java.lang패키지
      람다식
      Arrays
      코드트리
      안드로이드 스튜디오
      Collections Framework
      outputstream
      역직렬화
      snail
      map()
      코딩트리조별과제
      알고스팟
      스트림
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    탐욕법 (Greedy Method)
    상단으로

    티스토리툴바