탐욕적기법 문제

강정우·2022년 7월 30일
0

algorithm

목록 보기
8/28
post-thumbnail

1. 거스름돈

import sys

def coinChange(n) :
    '''
    n원을 돌려주기 위해 필요한 동전 개수의 최솟값을 반환하는 함수를 작성하세요.
    '''

    result = 0 #동전의 개수의
    
    coins = [100, 50, 10, 5, 1]

    for coin in coins:
        result += n//coin
        n = n%coin # 지불하고 남은 액수

    return result

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    n = int(input())

    print(coinChange(n))

if __name__ == "__main__":
    main()

2. 기울기가 가장 큰 두 점 찾기 (Big)

import sys

def getSlope(a,b):
    return abs((b[1] - a[1]) / (b[0] - a[0]))


def maxSlope(points) :
    '''
    n개의 점들 중에서 2개의 점을 선택했을 때, 얻을 수 있는 기울기의 절댓값 중에
    서 가장 큰 값을 반환하는 함수를 작성하세요.

    **주의** : 소숫점 넷째자리에서 반올림하는 것은 고려할 필요가 없습니다. 
    이는 main()에서 출력을 할 때에 처리가 되므로, 
    기울기의 최댓값을 구하는 것에 집중해 주시길 바랍니다.
    '''
    points.sort() # x축을 기준으로 일단 정렬
    result = 0 # 최대 기울기
    for i in range(len(points)-1):
        result = max(result, getSlope(points[i], points[i+1]))

    return result

def main():

    n = int(input())
    points = []

    for i in range(n) :
        line = [int(x) for x in input().split()]
        points.append( (line[0], line[1]) )

    print("%.3lf" % maxSlope(points))

if __name__ == "__main__":
    main()

3. Fractional knapsack

import sys

def fKnapsack(materials, m) :
    '''
    크기 m까지 버틸 수 있는 베낭이 담을 수 있는 최대 가치를 반환하는 함수를 작성하세요.

    주의 : 셋째 자리에서 반올림하는 것을 고려하지 않고 작성하셔도 됩니다. 
    물건을 가성비 순서대로 넣기.
    x[0] : 무게
    x[1] : 가치
    '''
    materials = sorted(materials, key = lambda x : x[1]/x[0], reverse = True)

    weight = 0
    value = 0

    for i in range(len(materials)):
        '''
        물건을 넣어도 아직 버틸만한 무게일 때.
        물건을 넣으면 딱 m만큼 무게가 될 때.
        물건을 다 넣으면 m을 넘어갈 때.
        '''
        if weight + materials[i][0] < m :
            weight += materials[i][0]
            value += materials[i][1]

        elif weight + materials[i][0] == m :
            weight += materials[i][0]
            value += materials[i][0]
            return value
            
        else:
            temp = m- weight		# 배낭의 남은 공간
            value += temp * (materials[i][1]/materials[i][0])
            return value

    return value		# 가방이 개쩔어서 모든 것을 다 넣어도 자리가 남을 때

def main():

    line = [int(x) for x in input().split()]

    n = line[0]
    m = line[1]

    materials = []

    for i in range(n) :
        data = [int(x) for x in input().split()]
        materials.append( (data[0], data[1]) )

    print("%.3lf" % fKnapsack(materials, m))

if __name__ == "__main__":
    main()
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글

관련 채용 정보