09/25 알고리즘
Greedy : 탐욕스러운 , 현재 상황에서 가장 좋아보이는 것만을 선택하는 알고리즘.
그리디는 기준에 따라 좋은 것을 선택하는 알고리즘이므로 문제에서 '가장 큰 순서대로', '가장 작은 순대로'와 같은 기준을 제시해준다.
문제1) 거스름돈
: 거스름돈으로 500,100,50,10원짜리가 있다.. 손님에게 거슬러줘야할 돈이 N원일때 거슬러 줘야할 동전의 최소개수를 구해라. -> 여기서도 "최소개수"가 있다. -> "가장 큰 화폐"부터 돈을 거슬러주는게 가장 적은 갯수로 할 수 있을것이다.
200원을 거슬러줘야한다고 고려해보자. -> 500원은 200원보다 많네? 그러면 넘어가 -> 100원짜리는 어? 2개만 주면 되네 2개! -> 최종 2개
220원을 줘야한다고 고려해보자 -> 위에서 100원짜리 2개를 주고나면 -> 이제 20원이 남는다. -> 20원은 50원보다 많으니까 넘어가 -> 이제 남은 20원은 10원짜리 2개로 하면 되지 -> 최종 4개
코드를 짜보자
n = input()
count = 0
moneys = [500, 100, 50, 10]
for money in moneys:
count = count + (n // money)
n = n % money
이렇게 하면 화폐의 종류만큼 반복을 수행하게 된다. -> 화폐 종류가 n개이면 시간 복잡도는 O(n)
문제2) 큰 수의 법칙 : 다양한 수로 이루어진 배열이 있을때, 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙. 그렇지만 반복을 주어진 K번을 초과해서 할 수는 없음.
3,4,5,4,6으로 이루어진 배열이 있을때 M이 6이고 K가 3이라고 생각하면 6번을 더하고 3번까지만 더할수 있으므로
6+6+6+5+6+6 = 35 . 생각해보니 이건
"가장 큰수를 더할수있는만큼 더하고 그다음으로 큰거 딱 1번더하고 다시 가장 큰수를 더할수있는 만큼하면 될거같다는 느낌이 왔다."
서로 다른 인덱스에 있는 수가 같은 경우에도 서로 다른 것으로 간주한다.
조건
첫째줄에 N(2<=N<=1000), M(1<=M<=10000), K(1<=K<=10000)의 자연수가 주어지며, 자연수는 공백으로 구분.
둘째줄에는 N개의 자연수, K <= M
n,m,k = map(int, input().split())
datas = list(map(int,input().split()))
datas.sort() # 입력받은 수를 정렬
first = data[n-1] # 제일 큰수
second = data[n-2] #그 다음 큰수
result = 0
while True:
for i in range(k):
if m == 0:
break
result = result + frist
m = m - 1
if m ==0:
break
result = result + second
m = m -1
여기서 반복되는 수열의 길이는 M을 K+1로 나눈몫이 된다. 왜 K가 아니고 K+1이냐? 그건 K는 제일큰거 반복하는 수고 1은 그다음 큰거 이렇게 하나이기떄문에 K+1이다.
1등 1등 1등 1등 2등 : 이런 기분?
그럼 제일 큰거는 몇번 반복될까? int(M // (K+1)) * K + M % (K + 1)
#3 1이 될때까지
: 어떠한 수 N이 1이 될때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다. 단 두 번째 연산은 N이 K로 나누어떨어질때만 선택할 수 있다.
- N = N -1 N에서 1을 뺀다.
- N = N / k N을 K로 나눈다. 나뉘어야지만 가능함
N=17, K=4라고 가정해보자.
N=17 -> (N-1) -> 16 -> /4 -> 4 -> /4 -> 1 == 3번
이걸 풀려면 "최대한 많이 나눠서" 값을 낮추는게 좋을 거같다.
n, k = map(int, input().split())
result = 0
while n >= k:
while n % k != 0:
n = n - 1
result = result + 1
n = n // k
result = result + 1
# n이 k보다 작아지면 이제 못나누고 빼줘야하기때문에 빼준다.
while n > 1:
n = n - 1
result = result + 1
Author And Source
이 문제에 관하여(09/25 알고리즘), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rodeve/0925-알고리즘저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)