[이코테]그리디(greedy)알고리즘

서희찬·2022년 1월 12일
0

코테준비python 편

목록 보기
5/13

그리디 알고리즘


코테에서 나오는 그리디 문제들은 탐욕법으로 나오는 해가 답인 케이스라고 생각해야한다 !

그리디 알고리즘 예제

거스름 돈

최소개수를 구해야하니 가장 큰 단위의 동전부터 주는것이 최소의 수를 보장할것이라고 생각한다..!

그럼 영상에서 제시하는 해결아이디어를 보자

문제 해결 아이디어


이와같이 큰단위의 동전부터 전달해줘야한다 !

정당성 분석


이와같이 그리디알고리즘 문제에서는 정당성 분석이 중요하다.

n=1260 
cnt =0 
arr = [500,100,50,10]

for coin in arr:
    cnt+=n//coin
    n%=coin 
print(cnt)

1이 될 때까지



나누기를 하는 케이스가 빼기를 하는 케이스보다 더 최소의 cnt를 가지게 할것이니 k의 배수일때 나눌수 있으면 나누고 못나누면 빼기를 해줘서 k의 배수까지 가게하는 방법을 찾으면 될것이라 생각한다.

이제 영상의 문제 해결 아이디어를 확인하자.

문제 해결 아이디어

정당성 분석

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

result = 0
while True:
    target = (n//k)*k
    result += (n-target)
    n = target 
    if n<k:
        break 
    result+=1
    n//=k 
result+=(n-1)
print(result)

target을 찾아주는 테크닉으로 풀어줄 수 있는 문제이다.

곱하기 혹은 더하기



아마.. 더하기 보다는 곱하기가 큰데 0이나 1이 오는 경우에는 곱하기보다 더하기가 더 큰 값을 가지게 하니 0,1일때만을 예외로 더하기로 하고 그외에는 곱하기 과정을 해주면 될것같다.

문제 해결 아이디어

data = input()

result = int(data[0])
for i in range(1,len(data)):
    num = int(data[i])
    if num<=1 or result<=1:
        result+=num 
    else :
        result *= num 
print(result)

모험가 길드



정렬을 진행하고 앞에서부터 공포도를 체크하며 그룹을 만들어 나가면 될것이다.

문제 해결 아이디어

n= int(input())
data = list(map(int,input().split()))
data.sort()

result = 0
cnt = 0
for i in data:
    cnt+=1
    if cnt>=i:
        result+=1
        cnt=0 
print(result)

이처럼 그리디 알고리즘은.. 아이디어가 좋아야할것같다..
최적의 해가 나올거라는 확신...참 어렵다..

profile
Carnegie Mellon University Robotics Institute | Research Associate | Developing For Our Lives, 세상에 기여하는 삶을 살고자 개발하고 있습니다

0개의 댓글