본문 바로가기
ALGORITHM/이코테

[ALGORITHM] 3. 그리디

by 뭉망뭉 2022. 2. 27.

이것이 취업을 위한 코딩테스트다 python 문제 풀이

3-1. 거스름돈

# C3. GREEDY - 거스름돈

import sys
put = sys.stdin.readline

n = int(put())
count = 0

list = [500, 100, 50, 10]
for coin in list:
    # n - i
    # count =+ 1
    count += n // coin
    n %= coin

print(count)

 

3-2. 큰 수의 법칙

내 풀이

# C3. GREEDY - 실전 문제 '큰 수의 법칙'

import sys
put = sys.stdin.readline

n, m, k = map(int, put().split())
nums = list(map(int, put().split()))
sum = 0

nums.sort(reverse=True)
for i in range(1, m+1):
    if i < k: # i=1인 경우 커버
        sum += nums[0]
    elif i % k != 1: # 제일 큰 수 k번 더하기
        sum += nums[0]
    elif i % k == 1: # k번 다음에 두 번째로 큰 수 더하기
        sum += nums[1]
print(sum)

책 풀이

# 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) # 최종 답안 출력

 

3-3. 숫자 카드 게임

내 풀이

# C3. GREEDY - 실전 문제 '숫자 카드 게임'

import sys
put = sys.stdin.readline
answer=0
n, m = map(int, put().split())
for i in range(1, n+1):
    nums = list(map(int, put().split()))
    answer_list = min(nums)
    answer = max(answer, answer_list)    
print(answer)

책 풀이 - 2중 반복문 구조 활용

# 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) # 최종 답안 출력

 

3-4. 1이 될 때까지

내 풀이

# C3. GREEDY - 실전 문제 '1이 될 때까지'

import sys
put = sys.stdin.readline
n, k = map(int, put().split())
num=0
while n!=1:
    if n%k==0: 
        n=n/k
        num+=1
    else: 
        n=n-1
        num+=1
print(num)

책 풀이 - 단순하게 풀기

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

// N이 K 이상이라면 K로 계속 나누기
while n >= k:
    # N이 K로 나누어 떨어지지 않는다면 N에서 1씩 빼기
    while n % k != 0:
        n -= 1
        result += 1
    # K로 나누기
    n //= k
    result += 1

# 마지막으로 남은 수에 대하여 1씩 빼기
while n > 1:
    n -= 1
    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)

'ALGORITHM > 이코테' 카테고리의 다른 글

[ALGORITHM] 8. 다이나믹 프로그래밍  (0) 2022.03.06
[ALGORITHM] 7. 이진 탐색  (0) 2022.03.05
[ALGORITHM] 6. 정렬  (0) 2022.03.04
[ALGORITHM] 5. DFS/BFS  (0) 2022.03.01
[ALGORITHM] 4. 구현  (0) 2022.02.28

댓글