그리디(Greedy) 알고리즘
현재 상황에서 지금 당장 좋은 것만 고르는 방법인 탐욕적으로 문제를 푸는 알고리즘
대부분 그리디 알고리즘을 이용했을 때 최적의 해를 찾을 수 없을 가능성이 높기 때문에 알고리즘으로 문제의 해법을 찾았을 경우 정당한지 검토해야 한다.
예제 3- 1 거스름돈 코드 : 시간 복잡도 O(화폐의 갯수)
직접 작성한 코드에서 수정할 부분
- C언어에서 for문을 통해 배열을 사용하는 방법에서 벗어나서 for문을 in과 함께 사용하여 list 데이터를 변수로 바로 꺼내쓸 수 있도록 한다.
ex) for coin in coin_type
- 7번째 줄 → N %= coin[i]로 간단하게 작성 가능
실전문제 - 큰수의 법칙
처음에 m//k로 계산 실수 --> m//(k+1)로 변경
(배열의 크기로 나눠줘야 했다)
실전문제 - 숫자 카드 게임
수정해야 할 부분
-> 모든 카드 숫자를 저장할 필요 없이 for문 하나로 min값만 저장 가능하도록
실전문제 - 1이 될 때까지
N, K = map(int, input().split())
count = 0
while N>1:
N = N//K if N%K==0 else N-1
count+=1
print(count)
수정해야 할 부분
-> n >= k 일때까지만 n이 k로 나누어지는지 검사하면 된다. 그리고 마지막에 남은 수에 대해서 1씩 빼준다. 빨리하기 위해서 남은 수 - 1을 count에 더해주면 된다.
-> n이 k로 나누어떨어지지 않을때까지 1을 뺀 후 나누면 된다. 이 부분을 빨리 하기 위해서 나누어떨어지는 몫을 구하고 나머지를 n에서 빼주면 빠르게 실행 가능
참고하는 책 : < 이것이 취업을 위한 코딩 테스트다 >
'study > 알고리즘' 카테고리의 다른 글
[알고리즘] 구현 : 시뮬레이션과 완전 탐색 (0) | 2021.11.10 |
---|---|
[알고리즘] DFS/BFS - 백준 1260번/2606번 (0) | 2021.11.09 |
[알고리즘] DFS/BFS (4) | 2021.11.08 |
[알고리즘] 이진탐색 (0) | 2021.11.04 |
[알고리즘] 파이썬 문법 복습 (0) | 2020.09.24 |