본문 바로가기
알고리즘 문제/자료구조&알고리즘

그리디

by 태윤2 2020. 10. 19.

Greedy(탐욕법) - 현재상황에서 지금 당장 좋은 것만 고르는 방법! 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
# 거스름돈 
# 파이썬
= 1260
count = 0
 
# 큰 단위의 화폐부터 차례대로 확인하기
coin_types = [5001005010]
 
for coin in coin_types:
    count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
    n %= coin
 
print(count)
cs

 

 

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
큰수의 법칙
 
n,m,k = map(int, input().split())
data = list(map(int,input().split()))
 
data.sort()
 
first = data[n-1]
second = data[n-2]
 
result = 0
 
while True:
  for i in range(k):
    if(m==0):
      break
    result += first
    m -=1
  if(m==0):
    break
  result += second
  m -=1
 
 
print(result)
 
cs

위의 코드에서  반복되는 규칙을 파악한 후 다시 짠 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# N,M,K를 공백으로 구분하여 입력받기
n,m,k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
data = list(map(int,input().split()))
 
data.sort() # 입력받은 수 정렬
 
first = data[n-1# 가장 큰 수
second = data[n-2# 두번째로 큰 수
 
# 가장 큰 수가 더해지는 횟수 계산
count = int(m/(k+1))*k
count += m%(k+1)
 
result = 0
result += count*first # 가장 큰수 더하기
result += (m-count) * second # 두 번째로 큰 수 더하기
 
print(result) # 최종 답안
cs

숫자 카드 게임 p96

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
n,m = map(int,input().split())
 
result = 0
 
# min() 
for i in range(n):
  data = list(map(int,input().split()))
  # 현재 줄에서 '가장 적은 수 ' 찾기
  min_value = min(data)
  # '가장 적은 수' 들 중에서 가장 큰 수 찾기
  result = max(result, min_value)
print(result)
 
# 또는 이중 for문
 
for i in range(n):
  data = list(map(int,input().split()))
  # 현재 줄에서 '가장 적은 수 ' 찾기
min_value = 10001
  for i in data:
min_value = min(min_value,a)
  result = max(min_value,result)
print(result)  
  
  cs

 

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
31
32
33
34
35
36
37
38
# 1이 될 때까지
 
n,k = map(int,input().split())
 
result =0
 
while n>=k:
  while n%k !=0:
    n-=1
    result+=1
  n //=k
  result +=1
  
print(result)
 
 
# N, K공백을 기준으로 구분하여 입력 받기
n, k = map(int, input().split())
 
result = 0
 
while True:
    # N이 K로 나누어 떨어지는 수가 될 때까지만 1씩 빼기
    target = (n // k) * k
    result += (n - target)
    n = target
    # N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
    if n < k:
        break
    # K로 나누기
    result += 1
    n //= k
 
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n - 1)
print(result)
 
 
cs

 

 

 

 

 

 

 

'알고리즘 문제 > 자료구조&알고리즘' 카테고리의 다른 글

정렬 예제  (0) 2020.10.22
정렬  (0) 2020.10.21
DFS/BFS 예제  (0) 2020.10.21
DFS(Depth First Search)/BFC(Breadth First Search)  (0) 2020.10.21
구현  (0) 2020.10.19