Skip to content
Home » 그리 디 알고리즘 파이썬 | (이코테 2021 강의 몰아보기) 2. 그리디 \U0026 구현 263 개의 가장 정확한 답변

그리 디 알고리즘 파이썬 | (이코테 2021 강의 몰아보기) 2. 그리디 \U0026 구현 263 개의 가장 정확한 답변

당신은 주제를 찾고 있습니까 “그리 디 알고리즘 파이썬 – (이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 동빈나 이(가) 작성한 기사에는 조회수 94,030회 및 좋아요 863개 개의 좋아요가 있습니다.

Table of Contents

그리 디 알고리즘 파이썬 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 (이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현 – 그리 디 알고리즘 파이썬 주제에 대한 세부정보를 참조하세요

[한빛미디어] 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저)
이 영상은 라이브 강의 때 진행했던 내용을 보완하여 1080 HD로 재녹화한 버전이며, 타임라인은 다음과 같습니다.
12강: 그리디 알고리즘 개요 00:00:00
13강: 그리디 유형 문제 풀이 00:11:14
14강: 구현 유형 개요 00:28:18
15강: 구현 유형 문제 풀이 00:41:22
교재 깃허브 주소: https://github.com/ndb796/python-for-coding-test

그리 디 알고리즘 파이썬 주제에 대한 자세한 내용은 여기를 참조하세요.

[알고리즘] 그리디(Greedy) 알고리즘과 예제 (파이썬) – velog

강의 바로가기개념과 코드, 이미지는 해당 책과 강의를 참고하였습니다.그리디(Greedy) 알고리즘은 탐욕법이라고도 하며, 현재 상황에서 지금 당장 …

+ 여기에 자세히 보기

Source: velog.io

Date Published: 12/12/2022

View: 2066

탐욕 알고리즘의 이해 – 잔재미코딩

4. 탐욕 알고리즘의 이해 1. 탐욕 알고리즘 이란? Greedy algorithm 또는 탐욕 알고리즘 이라고 불리움 최적의 해에 가까운 값을 구하기 위해 사용됨.

+ 더 읽기

Source: www.fun-coding.org

Date Published: 6/23/2022

View: 4584

[Python] 그리디(Greedy) 알고리즘 – Feel’s blog – 티스토리

해당 포스팅은 이것이 코딩 테스트다 with python(나동빈 지음) 교재를 공부하며 작성한 글입니다. 안녕하세요! 오늘은 그리디 알고리즘에 대해 알아 …

+ 여기에 더 보기

Source: casa-de-feel.tistory.com

Date Published: 11/7/2021

View: 3755

Python – 그리디 알고리즘 정복하기 1탄

greedy는 탐욕적이란 뜻이므로, 탐욕법이라고도 한다. 즉, 탐욕적으로 문제를 푸는 알고리즘이라는 뜻이다. 여기서 탐욕적이란게 문제를 풀때 현재 …

+ 여기에 표시

Source: ongbike.tistory.com

Date Published: 10/8/2021

View: 7678

21장 그리디 알고리즘 (파이썬 알고리즘 인터뷰) – 잠자는 하리보

그리디 알고리즘 (Greedy Algorithm) ❗❕탐욕, 욕심쟁이❗❕ 특징: 눈앞의 이익만을 좇는 알고리즘. 2가지 조건(탐욕 선택 속성& 최적 부분 구조) …

+ 여기에 자세히 보기

Source: harlie-98.tistory.com

Date Published: 4/6/2022

View: 3009

[Algorithm] 탐욕 알고리즘 (Greedy algorithm) – yg’s blog

이번 포스팅은 그리디(Greedy) 또는 탐욕 알고리즘에 대한 글이다. … 이것이 취업을 위한 코딩 테스트다 with 파이썬 – 나동빈

+ 여기를 클릭

Source: yganalyst.github.io

Date Published: 1/20/2022

View: 8587

그리디(Greedy) 알고리즘 – Python, Kotlin – 준영;한 개발자

[Algorithm] 그리디(Greedy) 알고리즘 – Python, Kotlin. 주 녕 2021. 7. 7. 03:08. 모든 내용은 이것이 취업을 위한 코딩테스트다(나동빈 저)의 내용을 정리한 것 …

+ 여기에 더 보기

Source: junyoung-developer.tistory.com

Date Published: 4/23/2022

View: 6820

[Python] 탐욕법, Greedy 알고리즘

하지만 코딩테스트의 Greedy 문제는 대개 탐욕법으로 얻은 답(해)이 최적의 답이 되는 상황이 주어집니다. 그리디 알고리즘의 대표문제 : 그리디 알고리즘 …

+ 여기를 클릭

Source: codingpractices.tistory.com

Date Published: 11/24/2022

View: 1363

그리 디 알고리즘 파이썬 | (이코테 2021 강의 몰아보기) 2. 그리 …

그리 디 알고리즘 파이썬 주제에 대한 자세한 내용은 여기를 참조하세요. · [알고리즘] 그리디(Greedy) 알고리즘과 예제 (파이썬) – velog · 탐욕 알고리즘 …

+ 자세한 내용은 여기를 클릭하십시오

Source: you.halongpearl.vn

Date Published: 12/2/2021

View: 4832

[Python algo] 탐욕 알고리즘 | Greedy algorithm

[Python algo] 탐욕 알고리즘 | Greedy algorithm. LeeSeunghyuk 2021. 1. 19. 12:04. 반응형. 안녕하세요. 오늘은 탐욕 알고리즘이란 무엇인가 알아보고 , 이를 간단 …

+ 여기를 클릭

Source: lsh-story.tistory.com

Date Published: 5/10/2021

View: 6915

주제와 관련된 이미지 그리 디 알고리즘 파이썬

주제와 관련된 더 많은 사진을 참조하십시오 (이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

(이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현
(이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현

주제에 대한 기사 평가 그리 디 알고리즘 파이썬

  • Author: 동빈나
  • Views: 조회수 94,030회
  • Likes: 좋아요 863개
  • Date Published: 2020. 9. 27.
  • Video Url link: https://www.youtube.com/watch?v=2zjoKjt97vQ

파이썬과 컴퓨터 사이언스(고급 알고리즘): 탐욕 알고리즘의 이해

coin_list = [ 500 , 100 , 50 , 1 ] def min_coin_count ( value , coin_list ): total_coin_count = 0 details = list () coin_list . sort ( reverse = True ) for coin in coin_list : coin_num = value // coin total_coin_count += coin_num value -= coin_num * coin details . append ([ coin , coin_num ]) return total_coin_count , details

[Python] 그리디(Greedy) 알고리즘

*해당 포스팅은 이것이 코딩 테스트다 with python(나동빈 지음) 교재를 공부하며 작성한 글입니다.

안녕하세요! 오늘은 그리디 알고리즘에 대해 알아보겠습니다.

그리디 알고리즘이란 단어 그대로 탐욕법이라고 할 수 있습니다.

코딩에서 탐욕적이라는 말은 ‘현재 상황에서 지금 당장 좋은 것만 고르는 방법’ 을 의미합니다.

그리디 알고리즘은 간단하고 유형이 다양하여 암기할 필요가 없지만 문제를 풀 때 창의력이 조금은 필요한 유형의 알고리즘입니다.

즉, 문제가 주어졌을 때 ‘어떠한 방식이 현재 상황에서 최선인가’ 를 빨리 떠올리는게 중요합니다.

최단거리를 구하는 다익스트라 알고리즘의 같은 경우도 그리디 알고리즘에 해당하므로 그리디 알고리즘에 대해 잘 이해해 두는 것이 좋겠습니다.

물론 그리디 알고리즘이 모든 경우에서 최선의 알고리즘은 아닙니다.

그리디 알고리즘이 최선의 알고리즘이 아닌 경우를 예를 들면, 마시멜로 이야기를 생각해 봅시다.

마시멜로 이야기에서 아이는 마시멜로를 받고 15분을 기다리면 두배로 더 받을 수 있습니다.

하지만 여기에 그리디 알고리즘을 적용하게 되면 아이는 매 상황에 마시멜로를 한개 밖에 받지 못하게 됩니다.

기다리면 마시멜로를 훨씬 많이 받을 수 있는데 말이죠.

이처럼 그리디 알고리즘이 최선이 아닌 경우도 존재합니다.

오늘은 그리디 알고리즘이 적용 가능한 기본적이고 간단한 예시를 풀어보겠습니다.

거스름돈 문제

요즘은 카드로 다 계산해서 거스름돈에 대해 생각할 필요가 거의 없는 시대지만 그리디 알고리즘을 이해하는데 매우 좋은 예시이니 알아봅시다.

‘카운터에서 점원이 거스름돈을 주는데 동전으로 거스름돈을 준다고 가정하고 500원, 100원, 50원, 10원짜리 동전이 무한히 있다고 가정합니다.

거슬러줘야 할 돈이 N원일 때 거슬러 줘야하는 동전의 최소 개수를 구하면 됩니다.

(이 때 N은 항상 10의 배수입니다.)

이 문제를 해결하는 아이디어는 매우 간단합니다.

바로 그냥 ‘가장 큰 단위의 동전 먼저 거슬러 주는 것’ 입니다.

이를 코드로 작성하면 다음과 같습니다.

n=int(input()) count=0 coin_types=[500,100,50,10] for coin in coin_types: count+=n//coin n%=coin print(count)

금액을 입력받고 동전의 단위를 coin_types 에 넣습니다.

반복문에서 금액을 가장 큰 단위의 동전부터 나눈 몫을 count 에 더합니다.

여기서 나온 몫은 그 단위의 동전의 개수를 의미합니다. 예를 들면 1110원일 경우 500원을 2개 주는게 최선의 선택이라고 할 수 있습니다.

이제 1000원은 거슬러 줬으니 거슬러줘야 하는 금액을 변경해줘야 하므로 금액을 그 단위의 동전으로 나눴을 때의 나머지 값으로 업데이트 해줍니다.

이 과정을 가장 작은 단위의 금액까지 반복하면 거슬러줘야할 동전의 최소 개수가 count에 저장되게 됩니다.

*그리디 알고리즘의 정당성*

그리디 알고리즘으로 문제의 해법을 찾을 때는 그 해법이 정당한가를 생각해봐야 합니다.

방금 보여드린 거스름돈 예시를 그리디 알고리즘으로 해결 할 수 있었던 이유는

‘가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 조합해 다른 해가 나올 수 없기 때문입니다.’

작은 단위의 동전으로 다른 동전의 단위가 나오는 예를 들어 보겠습니다.

돈을 800원을 거슬러 주는데 동전의 종류가 500원, 400원, 100원이라고 한다면 그리디 알고리즘으로 해결 할 경우 500원 1개, 100원 3개로 총 4개의 동전을 거슬러 줘야 합니다.

하지만 이 상황에서 동전을 최소로 거슬러 줄 수 있는 최선의 경우는 400원을 2개 거슬러 주는 것이 최선입니다.

이처럼 상황에 따라서 그리디 알고리즘이 적용되지 않을 수도 있으므로 그리디 알고리즘을 문제를 해결 할 때는

‘문제 풀이를 위한 아이디어를 떠올리고 이 아이디어가 정당한지 검토할 수 있어야 합니다.’

지금까지 그리디 알고리즘의 기본 원리와 간단한 예제에 대해 알아보았습니다.

Python – 그리디 알고리즘 정복하기 1탄

반응형

1. 그리디 알고리즘

greedy는 탐욕적이란 뜻이므로, 탐욕법이라고도 한다.

즉, 탐욕적으로 문제를 푸는 알고리즘이라는 뜻이다.

여기서 탐욕적이란게 문제를 풀때 현재 상황에서 가장 좋은 것만 고르는 방법을 말한다.

현재의 상황만 고려하고, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는게 큰 특징이다.

일단, 그리디 알고리즘이 유형은 다양하고, 많은 문제를 풀면서 사전 지식이 필요한 문제와 없는 문제를 구별해서 풀어야한다. 특히나, 창의력과 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 갖춰야 한다.

비슷한 알고리즘으로는 최단 경로를 빠르게 찾아야 하는 ‘플로이드 워셜 Floyd-Warshall’ 혹은 ‘다익스트라Dijkstra’ 알고리즘이 있다.

1. 그리디 – 거스름돈

1280원이라는 돈이 있다고 가정하자.

이 돈을 500원, 100원, 50원, 10원으로 거슬러 주려고 한다.

그럼 필요한 동전의 총 개수는?

n = 1280 count = 0 coin_types = [500, 100, 50, 10] for coin in coin_types: count += n // coin n %= coin print(count)

500원 x 2 , 100원 x 2, 50원 x 1, 10원 x 3

2 + 2 + 1 + 3 = 8개

result =>

간단한 예 : 시간 복잡도 O(k)

시간 복잡도는 화폐의 종류만큼 반복해야 하기 때문에, 동전의 전체 종류에만 영향을 받고, 거슬러 줘야하는 금액의 크기와는 무관하다.

2. 그리디 – 큰 수의 법칙

배열에서 주어진 수들을 m번 더하여, 가장 큰 수를 만드는 알고리즘이다.

단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 k번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.

예를 들어, 2 4 5 4 6 으로 이뤄져 있는 배열이 있다.

m이 8이고, k가 3이라고 하자.

가장 큰 수 : 6 , 두번째로 가장 큰 수 : 5

6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 = 6*6 + 5*2 = 46 이다

그리고 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주한다.

처음 이 조건을 받아들이는게 이해가 되지 않았다.

왜냐하면 같은 수가 나왔는데 제거하는게 맞나 싶었는데, 조건이 이렇다면 따르자.

즉, 4 5 4 5 4 로 이뤄져 있는 배열이 있을 때, m이 7이고, k가 2라고 가정하자.

이 경우, 두 번째 원소에 해당하는 5와 네 번째 원소에 해당하는 5를 번갈아 두 번씩 더하는 것이 가능하다.

결과적으로 5가 7번 더해지는, 5 + 5 + 5 + 5 + 5 + 5 + 5 인 35가 도출된다.

배열의 크기 N, 숫자가 더해지는 횟수인 M, 그리고 K가 주어질 때 , 큰 수의 법칙에 따른 결과를 출력해보는 문제를 풀어보자.

입력 조건 : 첫째 줄에 N( 2<= N <= 1,000) , M(1 <= M <= 1,000), K(1 <= K <= 10,000) 의 자연수가 주어지며, 각 자연수는 공백으로 구분한다. 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단 각각의 ㅏㅈ연수는 1 이상 10,000 이하의 수로 주어진다. 입력으로 주어지는 K는 항상 M보다 작거나 같다. 출력 조건 : 첫째 줄에 큰 수의 법칙에 따라 더해진 답을 출력한다. 입력 예시 : 5 8 3 1 3 5 4 6 출력 예시 : 46 * break, continue 문 차이점 : break 은 for 과 while과 같이, 제어 루프에서 벗어남, 완전히 벗어나는 것임. continue 는 제어(반복) 흐름을 유지한 상태에서 해당 코드의 실행만 건너뛰는 역할을 수행 break문을 쓰다보면, 어디에서 영향을 미치는지 헤깔렸는데 다음 예시를 보고 해결되었다. k = 0 while True: for i in range(50): k += 1 if i == 5: # i가 5일 때, 반복문을 끝냄, 여기서는 for문 break if k == 10: break # k가 10일때 while문을 끝냄 이제 문제를 푼 코드이다. 참고로 입력 값은 data와 data1 으로 구분해놓은 이유가, 초기에 받은 값이 정렬되는 과정을 보고 싶어서이다. 가독성을 위해서 리스트를 복사할때, 1번 : data2 = data1[:] 2번 : data2 = data1.copy() 라는 방식이 있는데 2번을 써야한다는 것을 배웠다. # n,m,k 공백으로 구분하여 받기 n,m,k = map(int, input().split()) # n개의 배열의 수들을 공백으로 구분하여 입력 받기 data = list(map(int, input().split())) # 가장 큰 수와 작은 수를 나눠서 받기, sort 쓰면 리스트 형태 변환됨 # 기본이 reverse = False 이다 data1 = data.copy() data1.sort() first = data1[n-1] # 가장 큰 수 second = data1[n-2] # 두번째로 큰 수 result = 0 while True: for i in range(k): # 가장 큰 수를 k 번 더해주기 if m == 0: break result += first m -= 1 # 더할때마다 m 은 1씩 감소 if m == 0: # m이 0이라면 반복문 탈출 break result += second # 두번째로 큰 수를 더해주기 m -= 1 # 더할때마다 m은 1씩 감소 print(result) 사용된 변수들 물론 실제 코드에서는 data와 data1을 따로 구분할 필요는 없을 것이다 예를 들어, 8개의 연산에서 k가 3이기에 (~ + ~ + ~ + ~ ) + (~ + ~ + ~ + ~ ) 이렇게 크게 두 덩어리로 4개의 합이 더해지는 모습이 나왔다. 하지만, m과 k가 한번에 떨어지지 않는 경우도 생길 수 있다. 그럴땐 위의 코드가 작동하지 않을 것이다. 즉, m이 k+1 로 나누어 떨어지지 않는 경우에서는 k+1 로 나눈 나머지만큼 가장 큰 수가 추가로 더해지는 상황이 생긴다. 즉, 가장 큰 수가 더해지는 횟수를 구해야한다. m이 8이고 k가 4라고 가정해보고, 가장 큰 수가 6이고 두번째로 큰 수가 5일때 ( 6 + 6 + 6 + 6 + 5 ) + (6 + 6 + 6 ,..) 마지막에 가장 큰 수가 더해지는 경우가 3번인게 나와야 된다. 기존의 더해지는 횟수 4번에서 + 3번인게 나와야 하므로, # n,m,k 를 공백으로 구분하여 받기 n,m,k = map(int, input().split()) # n개의 수를 공백으로 구분하여 받기 data = list(map(int, input().split())) data.sort(reverse=True) first = data[0] # 가장 큰 수 second = data[1] # 두번째로 큰 수 # 가장 큰 수가 더해지는 횟수 계산 count = int(m /(k+1)) * k count += m % (k+1) result = 0 result += (count) * first # 가장 큰 수 더하기 result += (m-count) * second # 두번째로 큰 수 더하기 print(result) 결과는 46이다 반응형

21장 그리디 알고리즘 (파이썬 알고리즘 인터뷰)

그리디 알고리즘 (Greedy Algorithm)

❗❕탐욕, 욕심쟁이❗❕

특징: 눈앞의 이익만을 좇는 알고리즘. 2가지 조건(탐욕 선택 속성& 최적 부분 구조) 만족하면 최적해 찾기 가능

장점: 조건이 맞지 않더라도 정답을 근사하게 찾는 용도로 활용, 계산 속도 빨라 실용적

단점: 보통의 경우 무조건 최적의 해를 보장하지 못함

ex) 다익스트라 알고리즘, 허프만 코딩 알고리즘, ID3 알고리즘

탐욕 선택 속성

현재 선택이 미래 선택에 영향을 주지 않는 것

즉, 현재의 최적 선택을 번복하지 않는다. (선택한 것을 버리고 다른 것을 취하지 않는다)

이는 다이나믹 프로그래밍과 가장 큰 차이점으로, 모든 단계를 끝내고 이전으로 돌아가 재고하는 과정이 없다는 의미

최적 부분 구조

전체문제의 해를 부분문제들의 해만으로도 구할 수 있게 분할가능한 구조

즉, 문제의 최적해 속에 부분 문제의 최적해가 포함되어 있고, 부분 문제의 해 속에 그 보다 작은 부분 문제의 해가 포함되어 있다

ex) 최적 부분 구조가 아닌 경우: 첫 번째 선택 후 남는 부분 문제는 최적이 아닌 방법으로 푸는 경우

그리디 알고리즘 VS 다이나믹 프로그래밍

다이나믹 프로그래밍

전체 문제를 여러 개의 하위 문제 로 나누어 최적의 솔루션을 찾고, 그 결과들로 최종 해를 찾음

로 나누어 최적의 솔루션을 찾고, 그 결과들로 최종 해를 찾음 항상 최적해를 보장

–> 모든 경우의 수를 고려

그리디 알고리즘

각 단계마다 로컬 최적해 를 찾는 문제로 접근해 문제를 더 작게 줄여나가는 형태이다

를 찾는 문제로 접근해 문제를 더 작게 줄여나가는 형태이다 항상 최적해 보장 X

번복 X

보통 다이나믹 프로그래밍보다 빠른 성능을 가짐

–> 서로 반대 방향으로 접근하는 구조이다.

그리디 알고리즘으로 해결 가능한 알고리즘??

배낭 문제

배낭에 담을 수 있는 무게의 최댓값이 정해져 있고 각각 짐의 가치와 무게가 있는 짐들을 배낭에 넣을 때 가치의 함이 최대가 되도록, 즉 달러의 가치가 최대가 되도록 짐을 고르는 방법을 찾는 문제

분할 가능 배낭 문제

cargro =[ # ($, kg) (4, 12), (2, 1), (10, 4), (1, 1), (2, 2), ] def fractional_knapsack(cargo): capacity = 15 pack=[] #단가 계산 역순 정렬 for c in cargo: pack.append((c[0] / c[1], c[0], c[1])) # 1kg당 달러, pack.sort(reverse=True) #(1, 1, 1), (0.5, 2, 1), (0.3333333333333333, 4, 12) #단가 순 그리디 계산 total_value : float =0 for p in pack: if capacity – p[2] >=0: #모두 들어간다면 capacity -=p[2] total_value +=p[1] else: # 쪼개서 들어가야 할 때 fraction = capacity /p[2] total_value += p[1] * fraction break return total_value #17.3

해당 코드는 짐을 쪼개서 넣었지만, 짐을 쪼갤 수 없다면 단가 순으로 배치해서는 안됨(해당 코드 사용하면 안 됨)

탐욕 선택 속성 즉, 번복하지 않는다에 위배

–> 다이나믹 프로그래밍으로 푸기 !

거스름돈 문제

동전의 액면이 10원, 50원, 100원처럼 증가하면서 이전 액면의 배수 이상이 되면 그리디 알고리즘으로 풀 수 있다.

우리나라의 경우 그리디로 문제 풀기 가능

160원의 거스름돈 받기

그디리 방법: 100원 x1 -> 50원 x1 -> 10원 x1 (총 3개의 동전)

최적의 방법: 80원 x2 (총 2개의 동전)

(80원은 50원의 배수가 아니며 100원은 80원의 배수가 되지 않는다. )

❌그리디로 최적해 찾기 불가능❌

가장 큰 합

그리디 알고리즘의 실패 사례

노드를 계속 더해가다가 마지막에 가장 큰 합이 되는 경로를 찾는 문제

잘못 찾은 가장 큰 합

3과 12를 비교해 12를 선택

이후 5와 6을 비교해 6을 선택

–> 합은 25

만약 7 -> 3 -> 99가 max 값. but, 그리디로 발견 X

[Algorithm] 탐욕 알고리즘 (Greedy algorithm)

개요

이번 포스팅은 그리디(Greedy) 또는 탐욕 알고리즘에 대한 글이다. 가장 기초가 되는 알고리즘이기도 하며 복잡한 문제를 단순하고 강력하게 해결할 수 있는 장점이 있다.

그리디 알고리즘이란?

탐욕법이라고도 하는 그리디(Greedy) 알고리즘은 “현재 상황에서 최적이라고 생각하는 해를 선택“하는 방법이다.

그러나 말그대로 앞으로 남은 선택들을 고려하지 않고 현재 상황만 고려하기 때문에 항상 최적해(Global optimum)를 보장하지는 않는다.

예를 들어, 아래 그림과 같은 트리구조의 경로가 있고 우리는 경로마다 놓여있는 돈을 얻을 수 있다고 해보자.

제일 많은 돈을 얻기 위해서는 빨간색 경로로 이동해야 하지만, 눈 앞에 놓인 갈림길에서 높은 금액만을 선택하는 그리디 방법은 파란색 경로로 이동한다. 따라서 $50 밖에 얻지 못한다.

그리디 알고리즘의 정당성

그리디 알고리즘으로 최적해를 도출하기 위해서는 아래 두가지 조건을 만족해야 한다.

1.탐욕적 선택 속성 (greedy choice property)

탐욕적인 선택이 항상 안전하다는 것이 보장된다는 의미이다. 즉, 그리디한 선택이 언제나 최적해를 보장해야한다.

2. 최적 부분 구조 (optimal substructure)

부분 최적해(Local optimum)들이 모여 전체 최적해(Global optimum)를 구할 수 있는 경우이다. 즉, 전체 문제가 여러 부분 문제로 분할되며, 이 단계 하나하나에 대한 최적해가 도출되어야 한다는 의미이다.

예를 들면, 아래와 같은 경로 찾기가 있을 수 있다.

위 그림 처럼 도시간 이동을 위와 같이 밖에 할 수 없다고 했을 때, 서울에서 대전의 최단경로(Local optimum)와 대전에서 부산의 최단 경로(Local optimum)가 모여 서울에서 부산까지 가는 최단 경로(Global optimum)가 될 것 이다.

예제 : 거스름돈 문제

대표적인 문제는 거스름돈 문제가 있다.

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

풀이 및 코드

# solve N = 1260 cnt = 0 for i in [ 500 , 100 , 50 , 10 ]: num_ = N // i N = N – num_ * i cnt += num_ print ( cnt )

# reference N = 1260 cnt = 0 for i in [ 500 , 100 , 50 , 10 ]: cnt += N // i N %= i print ( cnt )

아이디어는 두가지이다.

최소 동전의 개수이므로 큰 동전(500원)부터 거슬러준다.

거슬러 준 만큼 N에서 뺀다.

*몫의 계산으로 동일하게 접근했지만, 단순히 N에서 빼는 것이 아니라 나머지를 계산해주면 더 간단해진다.

논의

위 문제가 그리디하게 풀리는 이유는 가지고 있는 동전의 단위가 모두 배수의 형태이기 때문이다. 따라서 작은 단위의 동전을 종합해 다른 해가 나올 수 없으므로 언제나 최적해를 보장한다.

하지만 거스름돈 문제에서 단위가 서로 배수의 형태가 아니라, 무작위로 주어지는 경우에는 그리디가 아닌 다이나믹 프로그래밍으로 해결해야한다.

Reference

이것이 취업을 위한 코딩 테스트다 with 파이썬 – 나동빈

https://loosie.tistory.com/515

[Algorithm] 그리디(Greedy) 알고리즘 – Python, Kotlin

728×90

모든 내용은 이것이 취업을 위한 코딩테스트다(나동빈 저)의 내용을 정리한 것입니다.

그리디(Greedy) 알고리즘

‘탐욕’ 알고리즘

→ 현재 상황에서 지금 당장 좋은 것만 고르는 방법

∴ 매 순간 가장 좋아보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향은 고려하지 않음

이 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이기 때문에

문제에서 ‘가장 큰 순서대로’, ‘가장 작은 순서대로’와 같은 기준을 제시해줌

→ 이 기준은 정렬 알고리즘을 사용했을 때 만족할 수 있으므로 그리디는 정렬 알고리즘과 자주 함께 나온다!

[ 알고리즘 순서 ]

해 선택(Selection Procedure) : 지금 당장의 최적의 해를 구하고, 이를 부분 해 집합에 추가함 정당성 검사(Feasibility Check) : 새로운 부분 해 집합이 문제의 조건을 만족하는지 검사 해 검사(Solution Check) : 새로운 부분 해 집합이 문제가 있는지 검사하고, 해가 완성되지 않았다면 1번부터 다시 시작

→ 모든 문제에 그리디 알고리즘을 적용할 수 없음을 알 수 있다.

[ 예제 1 ] 거스름돈

음식점의 카운터에 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재함

손님에게 거슬러 줘야 할 돈이 N원 (N은 항상 10의 배수)

거슬러줘야 할 동전의 최소 개수는?

그리디 알고리즘을 이용해 풀 수 있는 대표적인 문제임.

동전의 최소 개수를 구해야 하므로 가장 큰 단위부터 돈을 거슬러 주면 된다.

# Python 코드 def solution(n): count = 0 coin_types = [500, 100, 50, 10] for coin in coin_types: count += n //coin n %= coin return count print(solution(1260))

// Kotlin 코드 fun main(args: Array) { println(min_coin(1260)) } fun min_coin(n: Int) : Int{ var count = 0 var money = n var coin_types: List = listOf(500, 100, 50, 10) for (coin in coin_types) { count += money/coin money %= coin } return count }

화폐의 종류만큼 반복을 수행하므로 화폐의 종류가 N개라고 했을 때, 시간 복잡도는 O(N)

이 알고리즘의 시간복잡도는 동전 종류의 수에만 영향을 받음

그리디 알고리즘이 가능한 이유? 가장 작은 단위의 동전을 조합하여 큰 단위의 동전을 만들 수 있기 때문

728×90

[Python] 탐욕법, Greedy 알고리즘

반응형

GREEDY 알고리즘

Greedy 알고리즘이란 ?

현재 상황에서 지금 당장 최선인 것, 좋은 것만을 고르는 알고리즘이다. 또한 탐욕 법이라고도 불립니다.

Greedy 알고리즘은 ‘정당성’ 분석이 매우 중요합니다. – 단순히 가장 좋아보이는 것을 반복저긍로 선택해도 최적의 답을 구할 수 있는지 검토가 필요합니다.

일반적인 상황에서 Greedy 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많습니다. 왜냐하면 탐욕법은 당장의 좋은 것을 선택하기 때문입니다. 하지만 코딩테스트의 Greedy 문제는 대개 탐욕법으로 얻은 답(해)이 최적의 답이 되는 상황이 주어집니다.

그리디 알고리즘의 대표문제 :

그리디 알고리즘은 대표적으로 k 원의 돈을 건네야할 때 n개의 잔돈 가짓수(500원, 100원, 50원..) 를 최소로 사용하는 값을 구하는 문제 등이 있습니다.

화폐의 종류가 n라고 할 때, 코드의 시간 복잡도는 O(n) 입니다. 거슬러줘야하는 금액과는 무관하며 동전의 총 종류에만 영향을 받습니다.

백준 사이트의 그리디 알고리즘 문제 :

https://www.acmicpc.net/problem/5585

https://www.acmicpc.net/problem/2839

https://www.acmicpc.net/problem/11399

https://www.acmicpc.net/problem/11047

References: https://www.youtube.com/watch?v=5OYlS2QQMPA

반응형

그리 디 알고리즘 파이썬 | (이코테 2021 강의 몰아보기) 2. 그리디 \U0026 구현 상위 184개 답변

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

[Python algo] 탐욕 알고리즘

반응형

안녕하세요

오늘은 탐욕 알고리즘이란 무엇인가 알아보고 , 이를 간단하게 구현해 보도록 하겠습니다.

### 탐욕 알고리즘(Greedy algorithm) ?

탐욕 알고리즘은 최적의 해를 구하는 방법입니다.

현재 상황에서 가장 좋다고 생각하는 것을 선택해 나가는 방식입니다.

또한, 이러한 선택 방법이 가장 좋을 것이라고 기대하고 사용하는 것입니다.

문제를 해결하는 과정에서 순간순간마다 최적의 결정 하는 방식

하지만 항상 최적의 답을 구해주지는 않습니다.

예시로 다음 과정을 확인하시면 됩니다.

step 1 : 1에서 시작

step 2 : 7 / 9 선택 -> 탐욕 알고리즘 , 9 선택

step 3 : 11 / 15 선택 -> 탐욕 알고리즘 , 15 선택

1 + 9 + 15 = 25

탐욕 알고리즘을 통해 25라는 값을 얻게 되었습니다.

하지만 실제로는 1 -> 7 -> 20 의 경우를 통해 28이라는 더 높은 수치를 얻을 수 있습니다.

이처럼 탐욕 알고리즘은 전역 최적화를 목적으로 하지만,

실제로는 국소 최적화 수치를 구하게 됩니다.

## Python 탐욕 알고리즘

탐욕 알고리즘에는 많은 예시가 있습니다.

그 중 거스름돈의 개수를 가장 적게 주는 방법을 찾아보도록 하겠습니다.

잔돈 리스트 = 1 , 50 , 100 , 500

금액 = 658

# 리스트 내림차순 정렬

잔돈 리스트를 역순(내림차순)으로 정렬합니다.

나눈 몫을 동전의 개수로 나타내고

새로운 금액은 나눈 나머지가 됩니다.

pay=658 coin=[1,50,100,500] coin=sorted(coin,reverse=True) print(coin) for i in coin: print(‘%s원 %s개’%(i,pay//i)) pay=pay%i

# 각 최소 개수를 구하는 함수 활용

def min_count(pay,coin): res={} for i in coin: res[i]=pay//i return res pay=658 coin=[50,1,500,100] min_count(658,coin)

정렬을 하지 않고 coin 전체를 함수에 인자로 넘깁니다.

각 coin의 원소 별 몫의 개수를 확인할 수 있습니다.

res 딕셔너리를 value값이 적은 순으로 정렬 , 첫 번째 Key와 value를 리턴합니다

def min_count(pay,coin): res={} for i in coin: res[i]=pay//i res=sorted(res.items(),key=lambda x:x[1]) return res[0] pay=658 coin=[50,1,500,100] min_count(658,coin)

위의 경우 문제가 있습니다.

value가 0인 경우에는 문제를 제대로 해결할 수 없습니다.

if문 하나를 추가해 완성할 수 있습니다.

pay=658 def min_count(pay,coin): # 거스름돈 단위, 개수를 담을 딕셔너리 res={} # 거스름돈 단위별 개수를 구함 for i in coin: if pay//i!=0: # 거스름돈 개수가 0개가 아니면 딕셔너리 추가 res[i]=pay//i # 2번째 인자를 기준으로(value) 오름차순 정렬 res=sorted(res.items(),key=lambda x:x[1]) return res[0] # 첫 번째 인자(value 가장 작은)return while pay: min_count(pay,coin) a,b=min_count(pay,coin) print(‘%s원 %s개’%(a,b),end=’ ‘) pay-=a*b

위 예시에서는 정렬로 간단하게 끝났지만

리스트의 인자간의 차이를 구한다거나, 계산이 필요한 경우에는

함수를 추가로 사용해서 구해야 할 수도 있습니다.

또, 추가적인 작업이 필요할 수 있으므로 하나의 알고리즘을 가장 간단한

한 가지 방법으로 구현하기 보다 조금 더 다양한 방법으로 해결해 보고자 했습니다.

읽어주셔서 감사합니다

반응형

키워드에 대한 정보 그리 디 알고리즘 파이썬

다음은 Bing에서 그리 디 알고리즘 파이썬 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 (이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현

  • 코딩 테스트
  • 파이썬 알고리즘
  • 알고리즘 공부
  • 알고리즘 코딩 테스트
  • 파이썬 코테
  • 코테 공부

(이코테 #2021 #강의 #몰아보기) #2. #그리디 #\u0026 #구현


YouTube에서 그리 디 알고리즘 파이썬 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 (이코테 2021 강의 몰아보기) 2. 그리디 \u0026 구현 | 그리 디 알고리즘 파이썬, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  백 테스트 사이트 | 423. 아이폰 12보다 훌륭한 한국주식 백테스트 사이트! 인기 답변 업데이트

Leave a Reply

Your email address will not be published. Required fields are marked *