AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • 프로그래머스
  • 파이썬
  • OpenCV
  • LEVEL2
  • level1
  • 이코테
  • 연습문제
  • Python
  • 알고리즘
  • 백준

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[이것이 코딩 테스트다 with Python ] 그리디 : 큰 수의 법칙
알고리즘/기타 알고리즘

[이것이 코딩 테스트다 with Python ] 그리디 : 큰 수의 법칙

2022. 1. 23. 17:14
교재 : 이것이 코딩 테스트다 with 파이썬
CHAPTER 3 그리디
실전문제 3-2 큰 수의 법칙 92p

 

문제

여기서 큰 수의 법칙이란 다양한 수로 이뤄진 배열이 있을 때 주어진 수들을 M번 더해 가장 큰 수를 만드는 법칙

단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과할 수는 없음

 

 

입력 조건

  • 첫째 줄에 N (2 ≤ N ≤ 1,000) , M (1 ≤ M ≤ 10,000) , K(1 ≤ K ≤ 10,000) 의 자연수가 주어지며, 각 자연수는 공백으로 구분합니다.
  • 둘 째줄에 N개의 자연수가 주어집니다. 각 자연수는 공백으로 구분합니다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어집니다.
  • 입력으로 주어지는 K는 항상 M보다 작거나 같습니다.

 

출력 조건

첫째줄에 큰 수의 법칙에 따라 더해진 답을 출력한다.

 

 


✔ Solution

N, M, K = map(int, input().split())
arr = list(map(int, input().split()))

arr.sort(reverse=True)  # 내림차순 정렬

value = (arr[0] * K + arr[1]) # 가장 큰 수 K번 두번째 큰 수 1번 더해준 값 
a, b = divmod(M, K + 1)  # a는 몫 b는 나머지
print(value * a + arr[0] * b)

 

 

✔ Solution 2

# 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] # 두 번째로 큰 수

result = 0 # 결괏값 초기화

while True:
    for i in range(k): # 가장 큰 수를 K번 더하기
        if m == 0: # m이 0이라면 반복문 탈출\
            break
        result += first
        m -= 1 # 더할 때 마다 1씩 빼기
    if m == 0 : # m이 0이라면 반복문 탈출
        break
    result += second # 두 번째로 큰 수를 한 번 더하기
    m -= 1 # 더할 때마다 1씩 빼기

    print(result)

 

 

✔ Solution 3

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

'알고리즘 > 기타 알고리즘' 카테고리의 다른 글

[그래프 탐색] DFS와 BFS  (0) 2022.01.24
자료구조 기초 - 스택(Stack)과 큐(Que)  (0) 2022.01.23
[이것이 코딩 테스트다 with Python] 백준 5585번 : 거스름돈  (0) 2022.01.23
[이것이 코딩 테스트다 with Python] 그리디 : 1이 될 때까지  (0) 2022.01.23
[이것이 코딩 테스트다 with Python] 그리디 : 숫자 카드 게임  (0) 2022.01.23
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바