티스토리 뷰
728x90
0. 그리디
그리디: 현재 상황에서 가장 좋아 보이는 것만을 선택하는 알고리즘
-> 현재의 선택이 나주에 미칠 영향에 대해서는 고려하지 않음
그리디 알고리즘 유형의 문제는 창의력, 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구
-> 특정한 문제를 만났을 때 단순히 현재 상황에서 좋은 것을 선택해도 문제를 풀 수 있는지 파악해야 함 !!
!! 문제에서 '가장 큰 순서대로', '가장 작은 순서대로'와 같은 기준을 제시
!! 정렬 알고리즘과 같이 출제 됨
ex) 거스름돈
당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리의 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.
sol)
‼️ point: 가장 큰 화폐 단위부터 돈을 거슬러 주는 것
500원으로 거슬러 줄 수 있을 만큼 거슬러 줌 -> 100원, 50원, 10원 순서로 거슬러 줄 수 있을 만큼 거슬러 줌
n = 1260
count = 0
coin = [500, 100, 50, 10]
for i in coin:
count += n // i
n %= i
print(count)
- 화폐의 종류만큼 반복 수행 -> 화폐의 종류가 K개일 때, 위 코드의 시간 복잡도: O(K)
1. 그리디 알고리즘의 정당성
그리디 알고리즘으로 문제의 해법을 찾았을 땐 그 해법이 정당한지 검토해야 함
바로 문제 유형을 파악하기 어렵다면 그리디 알고리즘을 의심!
-> 문제를 해결할 수 있는 탐욕적인 해결법이 있는지 고민
2. 실전문제
1) 큰 수의 법칙: 문제 책 참조
n, m, k = map(int, input().split())
num = list(map(int, input().split()))
num.sort()
first = num[n - 1]
second = num[n - 2]
result = 0
while True:
for i in range(k):
if m == 0:
break
result += first
m -= 1
if m == 0:
break
result += second
m -= 1
print(result)
2) 숫자 카드 게임: 문제 책 참조
n, m = map(int, input().split())
result = 0
for i in range(n):
data = list(map(int, input().split()))
min_value = min(data)
result = max(result, min_value)
print(result)
3) 1이 될 때까지
n, k = map(int,input().split())
count = 0
while n >= k:
while n % k != 0:
n -= 1
count += 1
n //= k
count += 1
while n > 1:
n -= 1
count += 1
print(count)
- 최대한 많이 나눈 다음 뺄 것
728x90
'📚코딩테스트 > 📔 이것이 취업을 위한 코딩테스트다' 카테고리의 다른 글
[이코테] 복잡도 Complexity (0) | 2022.03.15 |
---|
댓글