Hippo's data
그리디 알고리즘(Greedy Algorithm) 본문
오늘은 그리디 알고리즘(Greedy Algorithm)에 대해 알아보겠습니다!
그리디 알고리즘은 탐욕법, 욕심쟁이 알고리즘으로도 불리는데욥
그리디(Greedy)는 '탐욕스러운'이라는 뜻을 의미합니다
즉, 현재 상황에서 당장 좋은 것만 고르는 방법으로 문제를 푸는 알고리즘입니다!
매 순간 가장 좋아보이는 선택을 하며, 현재의 선택이 나중에 미칠 영향은 고려하지 않습니다
# 현재 상황에서 최적의 방법을 선택하게 되므로 풀이법이 항상 최적의 해를 보장할 수 있는지, 정당한지 판단 필요함
예제1) 거스름돈
당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.
-> 가장 큰 동전단위부터 돈을 거슬러주며 동전의 개수를 센다
간결한 풀이
# 가장 큰 동전단위는 작은 동전단위의 배수이므로 작은 동전단위를 종합하여 또 다른 해가 나올 수 없으므로 큰 동전단위부터 개수를 세는 것이 최적의 해를 보장하게 된다!
# 큰 동전단위가 작은 동전단위로 만들어질 수 없다면(배수가 아니라면) 다른 해가 존재할 수 있으므로 최적해인지 고려해야함
유사한 문제
[백준] 거스름돈
https://www.acmicpc.net/problem/5585
예제2) 큰 수의 법칙 [2019 국가 교육기관 코딩 테스트]
큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.
예를 들어 순서대로 2,4,5,4,6으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자.이 경우 특정한 인덱스의 수가 연속해서 세 번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6+6+6+5+6+6+6+5 인 46이 된다.
단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주한다.
예를 들어 순서대로 3,4,3,4,3으로 이루어진 배열이 있을 때 M이 7이고 , K가 2라고 가정하자. 이 경우 두 번째 원소에 해당하는 4와 네 번째 원소에 해당하는 4를 번갈아 두 번씩 더하는 것이 가능하다. 결과적으로 4+4+4+4+4+4+4 인 28이 도출된다.
배열의 크기 N, 숫자가 더해지는 횟수 M, 그리고 K가 주어질 때 철수의 큰 수의 법칙에 따른 결과를 출력하시오.
입력조건
첫째 줄에 N(2 ≤ N ≤ 1,000), M(1≤M≤10,000), K(1≤K≤10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어진다.
입력으로 주어지는 K는 항상 M보다 작거나 같다.
출력조건
첫째 줄에 큰수의 법칙에 따라 더해진 답을 출력한다.
입력 예시
5 8 3
2 4 5 4 6
출력 예시
46
-> 가장 큰 수를 K번 더한 후, 다음 번으로 큰 수를 한 번 더하는 작업을 반복하면 된다!
-> 결과론적으로 가장 큰 수와 다음 큰 수 총 2가지의 수만 사용이 되는 셈이다,,,,
예제3) 숫자 카드 게임 [2019 국가 교육기관 코딩 테스트]
숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다
단, 게임의 룰을 지키며 카드를 뽑아야 하고 룰은 다음과 같다.
1. 숫자가 쓰인 카드들은 N X M 형태로 놓여 있다. 이때 N은 행의 개수, M은 열의 개수를 의미한다.
2. 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
3. 그다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
4. 따라서 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다.
카드들이 N x M 형태로 놓여있을 때, 게임의 룰에 맞게 카드를 뽑는 프로그램을 만드시오.
입력 조건
첫째 줄에 숫자 카드들이 놓인 행의 개수 N과 열의 개수 M이 공백을 기준으로 하여 각각 자연수로 주어진다. (1 <= N,M <= 100)
둘째 줄부터 N개의 줄에 걸쳐 각 카드에 적힌 숫자가 주어진다. 각 숫자는 1 이상 10,000 이하의 자연수이다.
출력 조건
첫째 줄에 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력한다.
입력 예시
3 3
3 1 2
4 1 4
2 2 2
출력 예시
2
-> 각 행마다 가장 작은 수를 찾고, 그중 가장 큰 수를 찾는 문제
-> 문제는 길지만 아이디어만 떠올리면 매우 쉬운 문제이다!
예제4) 1이 될 때까지 [2018 E 기업 알고리즘 대회]
어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다.
단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있다.
1. N에서 1을 뺀다.
2. N을 K로 나눈다.
N과 K가 주어질 때 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오.
입력 조건
첫째 줄에 N(2 <= N <= 100,000)과 K(2 <= K <= 100,000)가 공백으로 구분되며 각각 자연수로 주어진다. 이때 입력으로 주어지는 N은 항상 K보다 크거나 같다.
출력 조건
첫째 줄에 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 횟수의 최솟값을 출력한다.
입력 예시
25 3
출력 예시
6
-> 최대한 많이 나누면 최소한의 시행 횟수로 1을 만들 수 있다. = 나누는 연산을 먼저 수행한다
이 글은 '이것이 취업을 위한 코딩 테스트다 with 파이썬(나동빈 저/한빛미디어)'를 참고하여 작성되었습니다
'Algorithm' 카테고리의 다른 글
우선순위 큐 구현 (PriorityQueue, Heap) (2) | 2024.10.03 |
---|---|
투 포인터(Two Pointer) 알고리즘 (5) | 2024.09.07 |
[구름] 숫자 제거 배열 Python 풀이 (0) | 2024.07.04 |
[구름] 구름스퀘어 Python 풀이 (0) | 2024.07.03 |
[구름] 정사각형의 개수 Python 풀이 (0) | 2024.07.03 |