🔊본 포스팅은 '(이코테 2021) 이것이 취업을 위한 코딩 테스트다 with 파이썬' 유튜브 강의를 수강하고 정리한 글입니다.
단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지 검토한다.
[문제 상황 1]
루트 노드부터 시작하여 거쳐 가는 노드 값의 합을 최대로 만들기 위한 최적의 해는 무엇인가요?
위 문제 상황에서 최적의 해는 5→7→9 순서이다.
노드 값의 합이 21로 최적의 해가 된다.
[문제 상황 2]
루트 노드부터 시작하여 거쳐가는 노드 값의 합을 최대로 만들기 위한 최적의 해는 무엇인가요?
Q. 단순히 매 상황에서 가장 큰 값만 고른다면 어떻게 될까요?
위 문제 상황에서 최적의 해는 5→10→4 순서이다.
가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다.
그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 한다.
n = 1260
count = 0
# 큰 단위의 화폐부터 차례대로 확인하기
array = [500,100,50,10]
for coin in array:
count += n//coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin
print(count)
화폐의 종류가 K라고 할 때, 화폐의 종류만큼만 반복을 수행하면되기 때문에 소스코드의 시간 복잡도는 O(K)이다.
1. N에서 1을 뺍니다.
2. N을 K로 나눕니다.
또한 N은 항상 1에 도달하게 된다.(최적의 해 성립)
# N,K을 공백을 기준으로 구분하여 입력 받기
n,k = map(int, input().split())
result = 0
while True:
# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
target = (n//k)*k
result += (n-target)
# N이 K보다 작을 때(더 이상 나눌 수 없을 때) 반복문 탈출
if n<k:
break
# K로 나누기
result += 1
n //= k
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n-1)
print(result)
data = input()
# 첫 번째 문자를 숫자로 변경하여 대입
result = int(data[0])
for i in range(1, len(data)):
# 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
num = int(data[i])
if num<=1 or result<=1:
result += num
else:
result *= num
print(result)
오름차순 정렬 이후에 공포도가 가장 낮은 모험가부터 하나씩 확인한다.
앞에서부터 공포도를 하나씩 확인하며 '현재 그룹에 포함된 모험가의 수'가 '현재 확인하고 있는 공포도'보다 크거나 같다면 이를 그룹으로 설정한다.
n = int(input())
data = list(map(int, input().split()))
result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in data: # 공포도를 낮은 것부터 하나씩 확인하며
count += 1 # 현재 그룹에 해당 모험가를 포함시키기
if count >= i: # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1 # 총 그룹의 수 증가시키기
count = 0 # 현재 그룹에 포함된 모험가의 수 초기화
print(result) # 총 그룹의 수 출력