Development record of developer who study hard everyday.

레이블이 그리디알고리즘인 게시물을 표시합니다. 모든 게시물 표시
레이블이 그리디알고리즘인 게시물을 표시합니다. 모든 게시물 표시
, , , ,

백준 11047번 문제 파이썬 해설(그리디 알고리즘)

백준 11047번 문제 파이썬 해설(그리디 알고리즘)

안드로이드 블로그

 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, k = map(int, input().split())

coins = []
for _ in range(n):
  coins.append(int(input()))
# coins = list(map(int, input().split('\n')))

# 코인 내림차순 정렬
coins.sort(reverse = True)
# print("coins:", coins)

count = 0

for coin in coins:
  # 코인이 k보다 작으면 더한다.
  if coin <= k:
    count += k // coin
    k %= coin
    # print("count:", count, "k:", k)
  else:
    continue

  if k == 0:
    break

print(count)

정답은 맞췄다.

짚고넘어갈 점은 엔터로 값을 쭉 입력할 때 받는 방법이다.

처음에는 모르고 6번줄 처럼 받을라고했는데 안된다;;

4,5번 줄처럼 간단하게 받을 수 있다!



Share:
Read More
, , , ,

백준 11399번 문제풀이 (그리디 알고리즘)

 백준 11399번 문제풀이 (그리디 알고리즘)


개발블로그

백준 11399번

그리디 알고리즘 문제이다.

각 사람이 돈을 인출하는데 필요한 시간의 최솟값을 구해야한다.

따라서 돈을 인출하는데 걸리는 시간이 작은 사람이 최대한 앞에 몰려 있어야한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
persons = int(input()) 

pList = list(map(int, input().split()))

pList.sort()

result = 0

for i in range(len(pList)): 
    result += pList[i] * (len(pList) - i)

print(result)

몇 번 틀렸는데 2번째 값을 받을 때, 5개를 한정해서 받아버렸다.

항상 일반화된 코드를 작성해야한다는 것에 주의하자!

다른 개발자의 블로그를 보면서 다른 풀이도 참고해보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
n = int(input())
numbers = list(map(int, input().split()))

numbers.sort() # 정렬
pre = 0 #이전 까지의 합
result = 0 #총 합계

for i in range(0, n):
  result += pre + numbers[i]
  pre += numbers[i]

print(result)
  

비슷한 로직인데 이전까지의 합을 따로 저장한다.


Share:
Read More