Algorithm/Greedy

[백준 17392번] 우울한 방학

킹우현 2023. 9. 29. 17:09

 

17392번: 우울한 방학

1일, 5일, 8일에 약속을 순서대로 배치하면, 4일과 10일에 각각 1만큼의 우울함을 느끼게 되어, 총 2만큼의 우울함을 느끼게 된다. 이보다 덜 우울함을 느끼게 만드는 방법은 존재하지 않는다.

www.acmicpc.net

n, m = map(int,input().split())

h = list(map(int,input().split()))

def getUnhappy(num):
    total = 0
    
    for i in range(1,num+1):
        total += i**2
    
    return total

happy = sum(h) + len(h)
unhappy = m - happy

area = [0] * (n+1)

index = 0

for i in range(unhappy):
    area[index] += 1
    index += 1

    if index >= n+1:
        index = 0

print(sum([getUnhappy(x) for x in area]))

이번 문제는 약속이 있는 날은 행복지수 Hi + 1일 만큼 기분이 유지되고 약속이 없는 날에는 기분이 -1 씩 떨어지는데, 기분이 0 미만인 날에는 (기분)^2 만큼 우울감을 느낀다는 가정하에 최소한으로 느낄 수 있는 우울감을 구하는 문제이다.

 

처음에 어떻게 풀지 고민한 끝에 행복지수 Hi + 1일 만큼은 기분이 0 이상으로 유지될 것이고, 기분이 0 미만인 날이 연속적으로 이어지는 것 보다 골고루 분배해서 최대한 연속되는 날이 적게 만들어주는 것이 더 우울감을 최소화할 수 있다는 것을 알게되었다.

 

따라서 약속의 개수가 n개라면 n + 1개의 분배 장소가 정해진다. n+1개의 구간에 최대한 균등하게 분배해야 하기 때문에 n+1개의 구간에 1씩 각각 한개씩 순회하면서 우울한 날을 넣어주면 된다.

 

그 후 연속된 날짜를 인자로 받고, 총 얻게 되는 우울감을 리턴하는 getUnhappy() 함수를 사용하여 그 합을 구해주었다.

 

Greedy를 오랜만에 풀어볼 수 있었던 좋은 문제였다 :)

 

 

'Algorithm > Greedy' 카테고리의 다른 글

[백준 23889번] 돌 굴러가유  (0) 2023.09.30
[프로그래머스 Lv.1] 체육복  (0) 2023.09.29
[백준 13305번] 주유소  (0) 2023.02.24
[백준 3109번] 빵집  (0) 2023.02.09
[백준 2217번] 로프  (0) 2023.02.09