Greedy and Implementation
1. 그리디 (Greedy)
그리디는 매 순간 가장 좋아보이는 것을 선택하여 미래의 영향은 고려하지 않는 알고리즘이다. 그리디 알고리즘은 기준에 따라 좋은 것을 선택하기 때문에 보통 가장 큰 순서대로, 가장 작은 순서대로 같은 기준이 있으면 그리디를 사용하면 된다. 그리고 정렬을 해야 그리디가 가능하기 때문에 정렬하는 것도 잊지 말아야 한다.
가장 쉬운 그리디 문제로 거스름돈 계산이 있다. 거슬러 줘야 할 돈이 n일때, 거슬러 줘야 할 동전의 최소 개수를 구하는 문제이다.
n = 1260
cnt = 0
coin_types = [100, 500, 50, 10]
coin_types.sort(reverse=True) # 화폐의 단위가 큰 것 부터 확인하기 위해 내림차순 정렬
# O(K)
for coin in coin_types:
cnt += n // coin
n %= coin
print(cnt)
이때 가지고 있는 동전의 큰 단위가 작은 단위의 배수 형태이기 때문에 그리디를 사용할 수 있다. 만약 화폐의 단위가 무작위로 주저진 경우에는 다이나믹 프로그래밍을 사용해야 한다.
2. 구현 (Implementation)
구현 문제는 풀이를 떠올리기 쉽지만 코드로 옮기기 어렵다. 사소한 조건들이 많거나, 실수 연산, 문자열 끊어서 처리 등 적절한 라이브러리 찾아서 사용해야 하는 문제들이 구현 문제에 해당한다. 즉, 완전 탐색이나 시뮬레이션 문제들이 구현에 해당한다.
완전 탐색은 모든 경우의 수를 다 계산하는 방법이고, 시뮬레이션은 문제에서 제시한 알고리즘을 차례대로 수행하는 방법이다.
3. 알고리즘 설계 및 시간제한
코딩 테스트에서 시간제한은 보통 1초~5초 정도이다. 시간 제한이 1초인 문제에서 일반적인 기준은 다음과 같다.
- N <= 500 : $O(N^{3})$
- N <= 2,000 : $O(N^{2})$
- N <= 100,000 : $O(NlogN)$
- N <= 10,000,000 : $O(N)$
시간과 메모리 측정
파이썬에서 프로그램의 수행 시간과 메모리 사용량을 확인하는 방법은 아래와 같다.
import time
from random import randint
start_time = time.time() # 현재 시간으로 측정 시작
array = []
for _ in range(1000):
array.append(randint(1, 100)) # 1부터 100 사이의 랜덤한 정수 배열에 삽입
end_time = time.time() # 현재 시간으로 측정 종료
print('time :', end_time-start_time) # 수행시간 출력
# time : 0.000997304916381836