그리디알고리즘 4

[그리디] 1이 될 때까지

[문제] - 숫자 N, K 가 주어진다. - N에 대하여 다음 두가지 연산을 할 수 있다. a. N-1 b. N/K (떨어질때만 가능) - a,b 연산을 이용하여 N을 1로 만들수있는 최소횟수를 만들어본다. - N=17, K=4 라면, a, b, b 연산으로 1을 만들 수 있다. [아이디어] - 1을 만들기위해서는 a 보다 b 가 유리하다. - 큰수에서는 당연하다. 작은수에서 검증을 해보면, N=2 일때 a 와 b 의 효력이 같아진다. - 결국 나눌수있다면 나누고, 나눌수 없다면 빼는 식으로 간다. [실패코드] n = 10000 k = 4 result = 0 # n 이 1보다 크다면 연산을 계속한다. while( n > 1 ): # n 이 k 로 나누어떨어지지않는다면, n에서 1을 빼준다. while (..

[그리디] 숫자 카드 게임

[문제] - m x n 의 2차행렬의 숫자카드가 주어진다. - 각 행마다 가장 작은숫자를 뽑는다 - 뽑은 작은숫자중에서 가장 큰 숫자를 뽑는다. 3 1 2 4 1 4 2 2 2 숫자카드에서는 1 / 1 / 2 중에 2가 뽑히게된다. [코드] n=3 m=3 map = [ [3, 1, 2], [4, 1, 4], [2, 2, 2] ] result = 0 for i in range(m): min_value = min(map[i]) result = max(result, min_value) print(result) [해설] - 단순하게 배열을 하나씩 탐색하면서 풀어간다. - min() 함수는 인자에있는 값중 가장 작은값을 리턴한다. - 배열의 1열, 2열, 3열 ... 을 하나씩 탐색하면서 최소값 min_value..

[그리디] 큰 수의 법칙

[문제] - 배열의 갯수는 N 이다. - 주어진 배열에서 M 번을 더하여 가장 큰 수를 만들어야 한다. - 특정 인덱스의 숫자는 연속으로 K 번을 초과할 수 없다. - [ 2, 4, 5, 4, 6] 배열이 있고, M=8, K=3 이라면, 6+6+6+5+6+6+6+5 = 46 이다. - 단, 인덱스가 다른데 같은숫자가 있다면, 이건 다른것으로 간주한다. - [ 3, 4, 3, 4, 3] 배열이 있고, M=7, K=2 라면 4+4+4+4+4+4+4 = 28 이다. [아이디어] - 배열에서 첫번째로 큰수를 찾고, 이걸 최대횟수 (K) 만큼 더해준다. - 배열에서 두번째로 큰수를 찾고, 이걸 최소횟수 (1) 만큼 더해준다. - 그다음 첫번째로 큰수를 다시 (K) 만큼 더해준다. n = 5 m = 8 k = 3 ..

[그리디] 거스름돈 문제

예제 3-1. 거스름돈 문제 - 거스름돈은 500원, 100원, 50원, 10원 동전이 무제한 존재한다. - 손님에게 거슬러줄 돈은 N원이다. - 거슬러 줘야할 동전의 최소 개수는 ? import time start_time = time.time() ## n = 1260 count = 0 coin_types = [500, 100, 50, 10] for coin in coin_types: count = count + ( n // coin ) # count n = n % coin print(count) ## end_time = time.time() print ("TIME : ", end_time - start_time) - 거슬러 주어야할 돈은 1260원이다. - 500원으로 나누게되면 ( 1260 / co..