Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

9시 24분

그리디 본문

알고리즘

그리디

leeeee.yeon 2021. 6. 18. 22:24

'이것이 취업을 위한 코딩 테스트다' 참고

 

그리디 : 현재 상황에서 가장 좋아 보이는 것만을 선택하는 알고리즘

 

[ 92쪽 큰 수의 법칙 ]

 

My Code

n, m, k = map(int, input().split())
num = list(map(int, input().split()))
num.sort(reverse=True) # 4 3 2 1
print(num)
result = 0

for i in range(m):
    if (i+1)%(k+1)==0:
        result += num[1]
    else:
        result += num[0]

 

책 속 Code

# 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) # 최종 답안 출력
  • count에 대한 코드를 따로 만들어 반복문을 사용하지 않았다.

 

[ 96쪽 숫자 카드 게임 ]

 

My code

n, m = map(int, input().split())
array = [[0]*m for _ in range(n)]
first = []
result = 0
for i in range(n):
    array[i] = list(map(int, input().split()))
    array[i].sort()
    first.append(array[i][0])

result = max(first)
print(result)

 

책 속 Code

# N, M을 공백을 기준으로 구분하여 입력 받기
n, m = map(int, input().split())

result = 0
# 한 줄씩 입력 받아 확인하기
for i in range(n):
    data = list(map(int, input().split()))
    # 현재 줄에서 '가장 작은 수' 찾기
    min_value = 10001
    for a in data:
        min_value = min(min_value, a)
    # '가장 작은 수'들 중에서 가장 큰 수 찾기
    result = max(result, min_value)

print(result) # 최종 답안 출력
  • 리스트를 추가적으로 만들지 않고 현재 행의 최소값과 min_value라는 변수를 비교해서 min_value 갱신

 

[ 99쪽 1이 될 때까지 ]

 

My Code

n, k = map(int, input().split())
count = 0
while n != 1:
    if n % k == 0:
        n = n // k
        count += 1
    else:
        n -= 1
        count += 1

print(count)

 

책 속 Code

# 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)

 

[ 백준 2839 설탕 배달 ]

n = int(input())

k = n // 5
count = 0

# 5의 개수를 줄여야 하는 경우, 5&3으로 나타낼 수 없는 경우
if (n - k * 5) % 3 != 0:
    while k >= 0:
        if (n - k * 5) % 3 == 0:
            count = k + (n - k * 5) // 3
            break
        k -= 1
    if k == -1:  # 4
        count = -1
else:  # 18
    count = k + (n - k * 5) // 3

print(count)
  • count = -1이 되는 부분 적절한 곳에 넣어야 함!

 

[ 백준 11047 동전 0 ]

n, k = map(int, input().split())

array = []
for _ in range(n):
    array.append(int(input()))
array.sort(reverse=True)

i = 0
count = 0

while k > 0:
    if array[i] > k:
        i += 1

    else:
        k -= array[i]
        count += 1

print(count)
  • Python3로 하면 시간 초과, PyPy3로 제출해서 통과

 

[ 백준 11399 ATM ]

import sys

n = int(sys.stdin.readline().rstrip())

array = list(map(int, input().split()))
array.sort(reverse=True)

result = 0

for i in range(n):
    result += array[i]*(i+1)

print(result)

'알고리즘' 카테고리의 다른 글

DFS/BFS  (0) 2021.06.25
구현  (0) 2021.06.21
파이썬 기본 문법 복습  (0) 2021.06.18
프로그래머스 SQL  (0) 2021.03.16
프로그래머스 - 기능개발  (0) 2021.03.10