본문 바로가기
개발일지/Python

Day2. 챕터3 그리디 - 큰 수의 법칙

by 개발에정착하고싶다 2022. 5. 18.
320x100
# 내 답안
import random as rd
N = rd.sample(range(2,1001))
M = rd.sample(range(1,10001))
K = rd.sample(range(1,10001))

# 여기까지 작성했다.
# 그리고 드는생각이 "배열의 크기"가 2부터 1001라고 하는데 이건 어떻게 활용하란거지?
# 게다가 숫자가 더해져야하는 수가 M이고 번갈아 나열이 가능한게 K라고 할때
# 이 수들이 만약 천단위든 만단위든 나오면 도대체 결과값이 얼마가 되는거냐
# 라는 생각이 들어서 더이상 진행하질 못했다.
# 뭔가 아직은 알고리즘의 문제를 파악하는게 모호하다.
# 솔직히 말하자면 뭐 알고리즘 문제마다 뭔가 말을 말같지 않게 하다 말고
# 풀어보라는 느낌인데; 암튼 내가 익숙해져야하는 문제같다.

 

 

# 해답 코드
# 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)

# 이렇게 쓰긴했는데 무한루프도는것같다.
# m 값이 while문을 움직이는 핵심같은데, 왜 코드정렬이 이렇게 되어있는지 잘 모르겠다.
# 특히 map 부분 전개가 난해하다

 

 

# 두번째 답안 예시;
# 첫번째 답안도 작동이 안되었지만 두번째는 어떨지..

# N,M,K를 공백으로 구분하여 입력받기
n, m, k = map(int,input().split())
# N개의 수를 공백으로 구분하여 입력받기
data = list(int,input().split())

data.sort() # 입력받은 수 정렬
first = data[n - 1] # 가장 큰 수
second = data[n - 2] # 두번째로 큰 수

# 여기서부터 될것같단 느낌이 들었다.
# 첫번째로 data라는 변수안에 n,m,k값을 리스트화 시켰고
# 두번째로 sort로 정리해줬고
# 세번째로 가장큰값, 다음으로 큰값을 별도의 변수에 저장해주었기 때문에
# 첫번째 답안보다 더 합리적이라는 생각이 들었다.

# 가장 큰 수가 더해지는 횟수 계산
count = int(m / (k + 1)) * k
count += m % (k + 1)

result = 0
result += (count) * first # 가장 큰수 더하기
result += (m - count) * second # 두번째로 큰 수 더하기

print(result)

# 도대체 왜 무한루프에 빠지는지 이해가 안가네;
# 에러면 에러지; 반복문도 없는데 이게 뭐냐;

 

 

# 에러내용이다.
Traceback (most recent call last):
  File "C:/pythonEx/project/6_029/quickEx.py", line 53, in <module>
    n, m, k = map(int,input().split())
  File "C:\Users\danie\AppData\Local\Programs\Python\Python38\lib\codecs.py", line 319, in decode
    def decode(self, input, final=False):
KeyboardInterrupt

Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)

 

 

# 챕터 3의 그리디는 전체적으로 설명도 하다마는 느낌이거나 필요한 부분에 대한 설명은 생략된 느낌이였다.
# 특히 n,m,k의 범위설정 부분, 그리고 이걸 map화 시키는것
# 이 두가지가 메인인데 이 두가지가 이해가 안되니깐 뭘해야할지 모르겠더라.
300x250