www.acmicpc.net/problem/11399 (level: Silver III)
자신감을 얻고, 다른 그리디 문제도 한 번 풀어보기 위해 목록을 좀 훑어보다가 비슷한 레벨의 문제에 한 번 도전해보았다. 이 문제는 어떻게 보면 운영체제에서 배우는 스케줄링과도 유사한 느낌이었다.🤔
아무튼 요지는 사람이 N명 있고, 각각 인출하는 데 걸리는 시간이 주어지는데 (이것도 당연히 N개) 이때 시간이 가장 적게 걸리는 경우, 그 시간이 얼마나 되는지 구해봐라- 뭐 이런 문제였다.
핵심은
1. 입력되는 값이 제멋대로이므로, 일단 입력 받은 후에 배열을 오름차순으로 싹 정렬해준다. 왜냐?
2. 인출하는 데 걸리는 시간이 가장 적은 사람을 가장 많이 포함하고, 인출하는 데 가장 오래 걸리는 사람의 시간을 가장 적게 포함할 때 그 값이 최소일 것이므로. (계산하기 쉽게 소요시간이 가장 적은 것부터 순서대로 정렬한다고 생각하면 쉽다.)
즉, 이 문제의 예시에서는 입력이 [3 1 4 3 2]로 주어지니까 배열에 저장한 뒤에 오름차순으로 정렬해 [1 2 3 3 4]로 만들어주고 👉🏻여기까지가 핵심 1번 /// 맨 앞에서부터 N번, N-1번, N-2번, N-3번, 마지막은 1번만 포함되는 것으로 계산해준 뒤 모두 더하면 된다. (물론, 더하는 연산은 이 로직을 반복 수행할 때마다 바로바로 update 해주는 것으로~🙄) 👉🏻여기까지가 핵심 2번
위에서 말한 핵심 2번에 대한 아이디어가 문제 읽자마자 떠올라서 쉽게 풀 수 있었던 것 같다.
이렇게 그림 그리면서 푸니까 왠지 수학문제 푸는 것 같기도 하고 재미있었다^_^
# date: 2021/04/23
# author: psS2mj
# brief: BOJ_11399_ATM
N = int(input())
waiting_times = list(map(int,input().split()))
waiting_times.sort() # 인출하는 데 걸리는 시간을 오름차순으로 정렬
time = 0
for i in range(N):
time += waiting_times[i] * (N-i)
print(time)
구현은 이런 식으로 했다.
오랜만에 풀다 보니 입력 받는 방법을 그때그때 찾아봐야 하는 상황^_^ㅎㅎ 조만간 익숙해지겠쥬?
그리고 sort와 sorted에 대해서도 조만간 정리해보려고 한다….
아무튼 입력 받고, 오름차순으로 정렬하고, 배열 앞에서부터 N, N-1, N-2, …, 1을 곱한 값을 time이라는 결과값에 누적해서 더해주면 된다는 것!! 마 그리디 별 거 없네~😆라고 허세를 떨어보며,,, - 끝 -
'🥇Problem Solving (psS2mj) > BOJ' 카테고리의 다른 글
[BOJ] 11721. 열 개씩 끊어 출력하기 (Java) (0) | 2021.05.02 |
---|---|
[BOJ] 11047. 동전 0 (Java) (0) | 2021.05.02 |
[BOJ] 11047. 동전 0 (Python3) (0) | 2021.04.23 |
[BOJ] 11721. 열 개씩 끊어 출력하기 (Python3) (0) | 2021.04.20 |
[BOJ] 5543. 상근날드 (Python3) (0) | 2020.09.12 |
댓글