본문 바로가기

알고리즘(Algorithm)

(45)
거스름돈 알고리즘(Coin Change Algorithm), 동전교환 알고리즘 [출처] https://www.amazon.com/School-Smart-Assorted-Plastic-Coins/dp/B00JKIEQPS 거스름돈 알고리즘(Coin Change Algorithm) 또는 동전교환 알고리즘은 동전 coins = { 1, 2, 5, 10, 20, 50, 100, 500, 1000}이 있고 값 V 가 주어졌을 때 V와 동일하도록 동전을 선택하는 문제인데 이때 동전의 개수를 최소화(minimum)하는 방법을 찾는 것이다. (단, 같은 동전을 여러번 선택 가능하다) 예를들어 coins = { 1, 2, 5, 10, 20, 50, 100, 500, 1000} 들이 있을때 선택한 동전의 개수는 최소화 하면서 동전의 합이 70원이 되도록 해야만 한다면 20원, 50원 동전 2개를 선택..
배낭 문제(Knapsack Problem) 배낭 문제(Knapsack Problem)는 조합 최적화의 유명한 문제로 한 여행가가 가지고 가는 배낭에 담을 수 있는 무게의 최댓값이 정해져 있고, 일정 가치(value)와 무게(weight)가 있는 N개의 짐(item)들을 배낭에 넣을 때, 가치의 합이 최대가 되도록 짐을 고르는 방법을 찾는 문제이다. [출처] https://en.wikipedia.org/wiki/Knapsack_problem 이 배낭문제는 짐을 쪼갤 수 있는 경우(무게가 소수일 수 있는 경우)와 짐을 쪼갤 수 없는 경우(이 경우 짐의 무게는 0 이상의 정수만 가능) 두 가지로 나눌 수 있는데, 짐을 쪼갤 수 있는 경우의 배낭문제를 분할가능 배낭문제(Fractional Knapsack Problem), 짐을 쪼갤 수 없는 경우의 배낭..
데드라인 스케줄링(Deadline Scheduling) - Job Sequencing Problem 마감일 전에 작업이 끝나면 모든 작업의 ​​마감 시간과 관련 이익이있는 일련의 작업이 제공됩니다. 또한 모든 작업에 단일 단위 시간이 걸리므로 모든 작업의 ​​최소 마감 시간은 1입니다. 한 번에 하나의 작업 만 예약 할 수있는 경우 총 이익을 최대화하는 방법. 작업순서문제 (Job Sequencing Problem)는 마감(deadline) 전에 작업을 완료하면 해당 작업에 연관된 이익(profit)이 제공된다. 데드라인이 있는 여러 작업들이 있을때 한번에 하나의 작업만 할 수 있는 경우 총 이익을 최대화 하는 방법을 푸는 것이다. 조건은 모든 작업에 단일 단위 시간(single unit of time)이 걸린다는 것이다. 즉 마감이 2시간 이면 최소 모든 작업에 걸리는 시간은 1시간이므로 최소 1시부..
이집트 분수(Egyptian Fraction) 이집트 분수(Egyptian fraction)란 유리수를 단위분수((분자가 1인것))의 합으로 표현하는 것을 말한다. [출처 ] https://www.futurelearn.com/courses/maths-puzzles/0/steps/13994 이집트 분수는 이집트에서 기원전부터 사용한 역사적인 사실 외에도, 분수의 또 다른 표현에서 많은 개체를 동일하게 공유할수있도록 나눈데 도움을 줄 수 있는 장점이 있다. 예를들어 만약 8명의 저녁 식사에 5개의 피자를 똑같이 나누기를 원한다면, 이집트 분수 표현은 아래처럼 표현 가능한데 이는 각 사람이 피자 반쪽(1/2)과 나머지 피자 8분의 1을씩 동일하게 공유할 수 있다는 것을 보여준다. 이것은 피자 4개를 반으로 나누고 나머지 피자는 8개로 나눌수 있고 또는 5..
활동 선택 문제(activity selection problem) Greedy 알고리즘의 첫 번째 예제는 활동선택문제(Activity Selection Problem) 이다. 활동선택은 먼저 시작(start)과 끝(finish) 시간이 n 개의 활동이 주어진다. 개인이 한 번에 하나의 활동에만 작업(즉 겹치는 시간에는 동일한 활동을 할 수 없다는 뜻) 할 수 있다고 가정 할 때 한 사람이 수행 할 수있는 최대 활동 수를 선택하는 문제라고 본다. [출처] https://aleen42.github.io/PersonalWiki/Algorithmn/Analysis/Greedy/Activity/Activity.html 예를들어 A라는 영업사원이 판매를 위해 a,b,c, 3개 업체와 미팅을 해야하는데 각 회의이 시작 시간과 회의 종료시간이 다음과 같다고 할때 A영업사원은 최대한 ..
탐욕 알고리즘(Greedy Algorithm)이란? 그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 문제를 해결과는 과정에서 결정(decsion) or 선택의 순간이 오면 그 순간만큼은 가장 최적의 답을 선택하여 최선의 결과를 만들어 내자라는 컨셉을 가지고 있는 알고리즘이다. 예를들어, A를 출발하여 B 경유지를 거처 목적지 C로 갈때 ( A -> B - > C) A->B 로 갈때 선택 할 수 있는경로가 3개가 있고 B->C 는 4개의 경로가 경로가 있다고 하면 A->B 로 갈수 있는 경로 3개중 1나를 선택한다면 가장 짧은 경로를 선택하고 B->C 로 갈때도 가장 빨리 갈수 있는 경로를 선택해서 최종적으로 A->C로 갈때 가장 빨리 갈수 있는 길을 찾아낼수 있다. 매 선택의 순간마다 항상 최소, 최대 또는 가장 최선의 답만 선택하..
순열(permutation) 알고리즘 순열(permutation)이란 숫자나 문자들의 집합(set)에 순서를 부여하여 나열하는 것이라고 생각하면 된다. 예를들어 원소가 'A', 'B', 'C'를 가진 집합 S 가 있다면 ( { 'A', 'B', 'C' } ∈ S) 이 A ,B, C 각각의 원소를 일렬로 나열했을때 나올수 있는 경우의 수는 (A, B, C), (A, C, B), (B, A, C), (B, C, A), (C, A, B), (C, B, A) 총 6가지가 나올수 있다. 순열에 대해서 자세히 알고 싶으면 순열(permutation) 를 먼저 읽어봐라. 그럼 순열을 프로그래밍적으로 어떻게 접근해야 할까? 만약 {a,b,c,d}의 모든 순열을 구한다고 하면 ☞ 첫 원소가 a이면서 {b,c,d}의 모든 순열 ☞ 첫 원소가 b이면서 {a,c..
정렬(Sorting)이란? 정렬(sort) 알고리즘이란 주어진 데이터가 있을 때 특정 규칙을 준수하도록 나열하는 문제이다. 특정 규칙을 준수하도록 나열한다는 의미는 특정 문제를 풀기위해 원하는(희망하는) 순서대로 다시 나열 한다는 것이다. 예를들어 주어진 데이터 A = { 4, 2, 1, 3 } 정수형으로 되어 있다고 가정해보자. 우리가 원하는 것은 A의 원소를 숫자가 커지는대로 또는 숫자가 작아지는대로 나열하고 싶다고 한다면 숫자가 커지는대로 정렬을 하면 A = { 1, 2, 3, 4} 로 나열되고 숫자가 작아지는대로 정렬을 하면 A = { 4, 3, 2, 1}로 나열되는 것이다. 정렬에서는 숫자가 증가하는 순을 오름차순정렬(Ascending Order Sorting) 이라고 하고 숫자가 작아지는 순서대로 정렬하는 것을 내림차순..