티스토리 뷰

728x90

0. 그리디

그리디: 현재 상황에서 가장 좋아 보이는 것만을 선택하는 알고리즘

-> 현재의 선택이 나주에 미칠 영향에 대해서는 고려하지 않음

 

그리디 알고리즘 유형의 문제는 창의력, 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구

-> 특정한 문제를 만났을 때 단순히 현재 상황에서 좋은 것을 선택해도 문제를 풀 수 있는지 파악해야 함 !!

 

!! 문제에서 '가장 큰 순서대로', '가장 작은 순서대로'와 같은 기준을 제시

!! 정렬 알고리즘과 같이 출제 됨

 

ex) 거스름돈

당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리의 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.

sol)

‼️ point: 가장 큰 화폐 단위부터 돈을 거슬러 주는 것

500원으로 거슬러 줄 수 있을 만큼 거슬러 줌 -> 100원, 50원, 10원 순서로 거슬러 줄 수 있을 만큼 거슬러 줌

n = 1260
count = 0

coin = [500, 100, 50, 10]

for i in coin:
    count += n // i
    n %= i
    
print(count)

- 화폐의 종류만큼 반복 수행 -> 화폐의 종류가 K개일 때, 위 코드의 시간 복잡도: O(K)

 

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

그리디 알고리즘으로 문제의 해법을 찾았을 땐 그 해법이 정당한지 검토해야 함

바로 문제 유형을 파악하기 어렵다면 그리디 알고리즘을 의심!

-> 문제를 해결할 수 있는 탐욕적인 해결법이 있는지 고민

 

2. 실전문제

 

1) 큰 수의 법칙: 문제 책 참조

n, m, k = map(int, input().split())
num = list(map(int, input().split()))

num.sort()
first = num[n - 1]
second = num[n - 2]

result = 0

while True:
    for i in range(k):
        if m == 0:
            break
            
        result += first
        m -= 1
    
    if m == 0:
        break
        
    result += second
    m -= 1
    
print(result)

 

2) 숫자 카드 게임: 문제 책 참조

n, m = map(int, input().split())

result = 0

for i in range(n):
    data = list(map(int, input().split()))
    min_value = min(data)
    
    result = max(result, min_value)
    
print(result)

 

3) 1이 될 때까지

n, k = map(int,input().split())

count = 0

while n >= k:
    while n % k != 0:
        n -= 1
        count += 1
    n //= k
    count += 1
    
while n > 1:
    n -= 1
    count += 1
    
print(count)

- 최대한 많이 나눈 다음 뺄 것

 

728x90
댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday