H. Lifeguards (Bronze)
Editor: 김정현 (powergee)
문제 상황 설명
N마리의 소가 인명 구조원으로 활동하고 있습니다.N마리의 소가 각자 담당하고 있는 시간이 있는데, 자금의 문제로 한 마리만 해고해야 합니다. 최소 한마리의 인명 구조원이 활동하는 시간이 최대가 되도록 적절히 한 마리를 해고하고자 합니다. 그렇다면 한 마리를 해고한 뒤에 최소 한 마리의 인명 구조원이 활동하는 최대 시간은 얼마일까요?
문제 풀이
이 문제에 대하여 생각할 수 있는 가장 간단한 풀이는 N마리의 모든 소들을 각각 해고하는 모든 경우를 계산하고 한 마리 이상이 활동하는 시간이 최대가 되는 경우를 찾는 것입니다. 다시말해, 1번째 소를 해고하는 경우의 시간, 2번째 소를 해고하는 경우의 시간, ..., N번째 소를 해고하는 경우의 시간을 모두 계산해봄으로써 최대 시간을 가지는 경우를 찾아낼 수 있습니다.
한 마리의 소를 제외한 소들의 집합에 대하여 최소 한 마리의 인명 구조원이 활동하는 총 시간을 계산하는 방법을 생각해야 합니다. 한 마리의 소를 제외한 소들의 집합을 라고 하고, 그 집합의 번째 소가 담당하는 시간을 구간 라고 하겠습니다. 총 시간을 계산하는데 아래와 같은 과정을 이용할 수 있습니다.
시간 구간을 표현하는 변수 를 선언하고, 이것의 초기값을 로 합니다. 이 구간의 시작점과 끝점은 각각 , 로 명명하겠습니다.
총 시간을 표현하는 정수형 변수 를 선언하고, 이것의 초기값을 0으로 합니다.
의 모든 번째 소에 대하여 순서대로 아래 분기를 수행합니다.
만약 라면, 에 를 대입하고 에 를 더합니다.
만약 라면, 의 에 를 대입하고 에 를 더합니다.
3번 과정을 수행한 뒤의 가 총 시간이 됩니다.
N마리의 모든 소에 대하여 반복문을 실행하는 데 의 시간 복잡도가 소요되며, 한 마리를 제외했을 때 최소 한마리의 인명 구조원이 활동하는 시간을 계산하는 데 의 시간 복잡도가 소요됩니다. 따라서 알고리즘 전체의 시간 복잡도는 입니다. (N개의 입력을 받는데 , 입력을 정렬하는 데 이지만 가장 큰 만 생각하였습니다.)
이 문제에서 N의 범위는 에 불과하므로, 의 큰 시간 복잡도로도 시간 제한 안에 결과를 도출할 수 있습니다.
소스 코드 (C++)
Last updated
Was this helpful?