본문 바로가기
○ 기술면접/알고리즘

[알고리즘] 그리디(Greedy): 지금 당장 좋은 것만 선택하라

by ZEROMI 2023. 3. 18.
728x90

1. 그리디

  • 탐욕법
  • 매 순간 가장 좋아 보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않음
  • '가장 큰 순서', '가장 작은 순서' 등의 기준은 대체로 정렬 알고리즘을 사용했을 때 만족시킬 수 있으므로 정렬 알고리즘과 자주 짝을 이뤄 출제된다.

1-1. 거스름돈 문제

  • 음식점 계산을 하는 점원이라 가정하였을 때 카운터에 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라.
    단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.
int n = 1260; //거슬러 줘야 할 잔돈 1,260원
int count = 0;

//큰 단위 화폐부터 차례로 확인
int[] coinType = [500, 100, 50, 10];

for (coin in coinType) {
	count += n/coin; //해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
    n %= coin;
}

System.out.println(count);
//화폐의 종류가 K개라면 위 소스 코드의 시간 복잡도는 O(K)이다.
//시간복잡도: O(4)

1-2. 그리디 알고리즘의 정당성

  • 그리디 알고리즘을 모든 알고리즘 문제에 적용할 수 있는 것은 아니다. 따라서 거스름돈 문제처럼 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 답을 도출할 수 있다.
  • 코딩 테스트 문제를 만났을 때, 바로 문제 유형을 파악하기 어렵다면 그리디 알고리즘을 의심하고, 문제를 해결할 수 있는 탐욕적인 해결법이 존재하는지 고민해보아야 한다.
  • 오랜 시간 고민해도 그리디 알고리즘으로 해결 방법을 찾을 수 없다면, 그 때는 다이나믹 프로그래밍이나 그래프 알고리즘 등으로 문제를 해결할 수 있는지 재차 고민해보아야 한다.
728x90