본문 바로가기
Algorithm/algorithm

그리디 알고리즘(greedy)

by 갈잃자 2022. 4. 14.

그리디 알고리즘이란

내게 주어진 정보에서 뒷일을 생각안하고 지금 당장 이득을 취할 수 있는것을 택하여 문제를 해결하는 방법이다.

 

윗말은 ssafy교육을 들으며 정리한 개념이고, 사실 우리가 알고리즘을 배우는대엔 문제에 적용하는 능력을 기르기위해 배운다고 생각한다. 고로 나만의 생각으로 정리를 해보자면

  • greedy로 풀수 있는지 없는지 판단하는게 중요! ex) 동전교환 문제 but 동전이 서로 배수관계일때만 사용할 수있다. 그리고 시간이나 횟수로 나오는 문제의 최대횟수, 최소동전갯수등을 구할때 유용하게 사용될 수 있다.
  • 입력된 데이터를 sort해서 greedy의 형태로 풀 수 있는지 확인해보기

시간복잡도: O(k) 여기서 k는 문제마다 다르지만 예시로 드는 문제로 치면 동전의 종류가 될 것이다.

위의 글을 읽어도 이해가 잘 안될 수 있으므로, 예시적인 문제를 해결해보자.


ex) 10원, 50원, 100원, 500원이렇게 네 종류의 동전이 있을때,

동전의 갯수를 최소로 사용하는 경우를 출력하자.

lst = [500,100,50,10]
sum = int(input())
cnt = 0

# 가장 큰 동전부터 나누어주며 해결하는 작업
while sum!=0:
    while (sum -lst[0]) >=0 :
        sum = sum - lst[0]
        cnt+=1
    while sum - lst[1] >=0:
        sum = sum - lst[1]
        cnt +=1
    while sum - lst[2] >=0:
        sum = sum - lst[2]
        cnt +=1
    while sum - lst[3] >=0:
        sum = sum- lst[3]
        cnt +=1
print(cnt)

만약 sum이란 변수에 830이라는 수가 들어간다면 결과는

7 #500원짜리1개 #100원짜리3개 #10원짜리3개

이렇게 출력이 된다.

 

ex2) 회의실이 하나인 회사에서 예약스케줄을 입력받고 최대 몇번의 회의가 가능한치 출력하시오.

n =6 #회의 예약잡힌 횟수
arr = [[1,6],[3,8],[8,9],[2,4],[4,6],[7,9]] # 회의예약시간 [시작시간,끝나는시간]
cnt = 0
arr.sort(key = lambda x: x[1]) # 끝나는시간을 기준으로 sort한다!
a, b = arr[0]
for i in range(n-1):
    if b < arr[i+1][1]:
        cnt +=1
        b = arr[i+1][1]
print(cnt)

위 코드를 출력하면

3

이된다.

'Algorithm > algorithm' 카테고리의 다른 글

플러드 필(flood fill)  (0) 2022.06.22
너비우선탐색(bfs)  (0) 2022.04.16
깊이우선탐색(dfs)  (1) 2022.04.16
카운팅정렬[counting sort]  (0) 2022.04.14
버블정렬[bubble sort]  (0) 2022.04.13

댓글