티스토리 뷰
그리디 알고리즘이란?
현재 상황에서 지금 당장 좋은 것만 고리는 방법 = 탐욕적, 욕심쟁이 기법! = GREEDY!
현재상황에서 가장 좋아보이는 것을 선택해도 문제를 풀 수 있나?를 생각했을 때 그것이 성립하다면 GREEDY를 시도할 것!
기본적인 예제
1. 거스름돈 문제 => 최소 거스름돈의 개수 => 개수를 적게 만들기 위해서는 당연히 주는 동전의 단위가 커야함.
=> for문을 돌릴때 동전의 단위가 큰 것부터 걸리게끔 조건을 걸고 동전의 나머지가 0이 되는 순간 개수 출력
x = int(input()) cnt = 0 while x!=0: if x//500: print(x//500) cnt = cnt + x//500 x = x%500 if x//100: print(x//100) cnt = cnt + x//100 x = x%100 if x//50: print(x//50) cnt = cnt + x//50 x = x%50 if x//10: print(x//10) cnt = cnt + x//10 x = x%10 print(cnt)
* list(map(int, input().split()))을 통해서 띄어쓰기별로 입력받은 값을 list로 저장할 수 있게 됨.
* 더 간결하게 작성하기 위해서는 500,100,50,10원을 list에 넣어놓고 차례대로 for문을 돌려도 됐음 => if문을 4개로 할 필요가 없어짐.
2. 큰 수의 법칙 => 입력받은 숫자에서 가장 큰 수를 계속 더해주다가 연속 더한 개수가 k개를 초과할 경우 그때는 그 다음의 큰 수를 더해주고 다시 가장 큰 수를 계속더하기를 반복.
#큰수의 법칙 n,m,k = map(int, input().split()) num = list(map(int, input().split())) num.sort() max_list=[] max_list.append(num[n-1]) max_list.append(num[n-2]) #print(max_list) #큰수, 그 다음으로 큰 수가 들어가있음 sum = 0 max_cnt=0 for i in range(0,m): if max_cnt<k: sum = sum+max_list[0] max_cnt = max_cnt+1 else: sum = sum+max_list[1] max_cnt=0 print(sum)
* sort()는 기본적으로 오름차순으로 내림차순 정렬했다면 .sort(reverse = True)로 작성하고 num[0], num[1]을 이용
3. 숫자 카드 게임 => 각 행의 가장 작은 숫자가 각 행을 선택했을 때의 결과이기에, 어떤 행을 선택해야 가장 큰 값을 나오는지 구하는 문제에서는 각 행별로 가장 작은 숫자를 list에 저장하고 배열해서 가장 앞의 값을 뽑아내거나 max를 사용하면 된다고 생각해서 max를 사용함
숫자 카드 게임 -> 가장 작은 수들을 행별로 저장하고 그 저장한 리스트에서 가장 큰 값을 뽑아내면 답 n, m = map(int, input().split()) min_=[] for i in range(n): list_=[] list_=list(map(int, input().split())) min_.append(min(list_)) print(max(min_))
4. 1이 될 때까지 => n에서 1을 빼거나 n을 k로 나누는 두가지 경우중 선택가능하지만 k로 나눌때는 나누어떨어져야 가능함 => 이때, n이 1이 되기 위해 수행해야하는 최소 개수를 구하면 되니까 n이 k로 나누어 떨어진다면 무조건 나누고 그게 아니라면 1을 어쩔 수 없이 빼야함
n,k = map(int, input().split()) sum=0 while n!=1: if n%k==0: n //= k sum += 1 else: n -= 1 sum += 1 print(sum)
'파이썬 > 파이썬 기초' 카테고리의 다른 글
dfs와 bfs (0) | 2021.08.01 |
---|---|
구현 (0) | 2021.07.25 |
리스트를 다루는 map()과 filter() - lambda (0) | 2021.03.28 |
파이썬 기초 - 알아두면 유용 (0) | 2021.03.24 |
정렬하기 (0) | 2021.03.22 |
- Total
- Today
- Yesterday
- 기사작성 대외활동
- CREATE ASSERTION
- 영화 리뷰 긍정 부정 분류
- CSMA/CD란?
- 코딩월드뉴스
- 백트래킹(1)
- stack 컨테이너
- 효율적인방법찾기
- LAMBDA
- 4963 섬의개수
- 스택 파이썬
- 시뮬레이션 c
- 백준 4963
- 온라인프로필 만들기
- 백준 15650 파이썬
- c++덱
- 딥러닝입문
- mm1queue
- DRF 회원관리
- 백준 10866
- 백준 11053 파이썬
- 기본 텍스트 분류
- 11053 백준
- 10866 백준
- 핀테크 트렌드
- 소프트웨어공학설계
- 13886
- 파이썬 알아두면 유용
- 백준 숫자놀이
- 모듈 사용법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |