[5911] 선물

백준 문제 풀이

5911번: 선물

  • 해설

      선물을 많이 주는 방법으로 금액을 나누어야 한다...
      할인은 한명만 가능하고, 배송비는 별도로 할인이 안된다.
        
      , 친구들  가격이 낮은(물건+배송비)순으로 배송을 보내는 것이 가장 이상적이다.
      가격이 낮은 순으로 정렬하고, 한명씩 할인된 가격과 비교해서 많이 보낼  있는 값을
      찾는다.
         
      입력
      각각 친구들의 물건값, 배송비를 입력받는다.
      N, B = map(int, input().split())
          gifts = []
          for i in range(N):
              item = list(map(int, input().split()))
              gifts.append(item)
        
      물건 값과 배송비 순으로 오름차순으로 정렬한다.
      gifts.sort(key=lambda x: (x[0], x[1]))
        
      정렬된 데이터에서 i 번째가 할인했을  총비용을 costs에 저장하고, 다시 정렬한다.
      그러면, 각각 친구들에게 배송비를 포함해서 정렬되고,
      비용이 costs에 저장되어있으니 이제 부터 합해서 보낸 횟수를 증가 시킨다.
       돈을 넘으면 멈추고, 아니라면 최대 횟수와 비교해서 값을 저장한다.
      max = 0
      # print(gifts)
      for i in range(N):
          costs = []
          for j in range(N):
              cost = 0
              if i == j:
                  cost = (gifts[j][0]/2) + gifts[j][1]
              else:
                  cost = gifts[j][0] + gifts[j][1]
              costs.append(cost)
          costs.sort()
          sum = 0
          p_count = 0
          for h in range(N):
              sum += costs[h]
              p_count += 1
              if sum > B:
                  break
              else:
                  if max < p_count:
                      max = p_count
        
       일련의 과정을 모두 거치면 max에는 보낸 횟수의 최대값이 들어감으로
      출력한다.
    
  • 답안

      if __name__ == '__main__':
          N, B = map(int, input().split())
          gifts = []
          for i in range(N):
              item = list(map(int, input().split()))
              gifts.append(item)
        
          gifts.sort(key=lambda x: (x[0], x[1]))
          max = 0
          # print(gifts)
          for i in range(N):
              costs = []
              for j in range(N):
                  cost = 0
                  if i == j:
                      cost = (gifts[j][0]/2) + gifts[j][1]
                  else:
                      cost = gifts[j][0] + gifts[j][1]
                  costs.append(cost)
              costs.sort()
              sum = 0
              p_count = 0
              for h in range(N):
                  sum += costs[h]
                  p_count += 1
                  if sum > B:
                      break
                  else:
                      if max < p_count:
                          max = p_count
        
          print(max)