그리디 알고리즘(탐욕법): 현재 상황에서 지금 당장 좋은것만 고르는 방법
문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구함
정당성 분석이 중요함, 단순히 가장 좋아보이는 것을 반복적으로 선택해서 최적의 해를 구할 수 있는지 검토하는 과정이 필요
코딩테스트에서 그리디 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 경우에 한해서 문제가 출제됨
그리디 알고리즘의 대표 예시: 거스름 돈 문제
n = 1260
result = 0
coins = [500, 100, 50, 10]
for coin in coins:
n = n % coin
result = result + (n // coin)
print(result)
n = 1260
count = 0
# 큰 단위의 화폐부터 차례대로 확인
array = [500, 100, 50, 10]
for coin in array:
count += count n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin # 남은 돈
print(count)
문제해결 아이디어
정당성 분석
내 풀이 (매번 while 문을 돌려줘야 하기에 시간복잡도가 큼)
n, k = map(int, input().split())
count = 0
while n > 1:
if n % k ==0:
n = n // k
count = count + 1
else:
n = n - 1
count = count + 1
print(count)
n, k = map(int, input().split())
count = 0
while = True:
#n이 k로 나누어 떨어지는 수가 될 때까지 빼기
target = (n // k) * k # n이 k로 나누어 떨어지지 않을 때 가장 가까운 k로 나누어 떨어지는 수가 어떤거지 찾음
count = count + (n-target) #1을 빼는 연산을 몇번 수행할지 한번에 더해줌
n = target
if n < k:
break
#k로 나누기
result = result + 1
n = n // k
# n이 1보다 크다면 마지막으로 남은 수에 대하여 1씩 빼기
result = result + (n-1)
print(result)
문제 해결 아이디어
내 풀이
# 두 수 모두 2 이상인 경우 곱하기 사용, 두 수 중 하나라도 0이나 1인 경우 더하기
s = input()
result = int(s[0])
for i in range(1, len(s)):
if int(s[i])>1 and int(s[i-1]) >1:
result = result * int(s[i])
else:
result = result + int(s[i])
print(result)
# 답안 예시
data = input()
result = int(data[0])
for i in range(1, len(data)):
num = int(data[i])
if num <= 1 or result <= 1:
result += num
else:
result *= num
print(result)
문제 해결 아이디어
내 풀이
n = int(input())
sc = list(map(int, input().split()))
group = 0
count = 0
sc.sort()
for i in sc:
count += 1
if count >= i:
group += 1
count = 0
print(group)
n = input()
s = list(map(int, input().split()))
s.sort()
group = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in s: # 공포도를 낮은 것부터 하나씩 확인하며
count += 1 #현재 그룹에 해당 모험가 포함
if count >= i: #현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
group += 1 # 총 그룹의 수 증가시키기
count = 0 # 현재 그룹에 포함된 모험가 수 초기화
print(group) #총 그룹 수 출력
참고: 이것이 취업을 위한 코딩 테스트다 with 파이썬 (취업과 이직을 결정하는 알고리즘 인터뷰 완벽 가이드), 유튜브 강의 영상