본문 바로가기
🥇Problem Solving (psS2mj)/BOJ

[BOJ] 11399. ATM (Python3)

by psS2mj 2021. 4. 23.
반응형

www.acmicpc.net/problem/11399 (level: Silver III)

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net


 

자신감을 얻고, 다른 그리디 문제도 한 번 풀어보기 위해 목록을 좀 훑어보다가 비슷한 레벨의 문제에 한 번 도전해보았다. 이 문제는 어떻게 보면 운영체제에서 배우는 스케줄링과도 유사한 느낌이었다.🤔

 

아무튼 요지는 사람이 N명 있고, 각각 인출하는 데 걸리는 시간이 주어지는데 (이것도 당연히 N개) 이때 시간이 가장 적게 걸리는 경우, 그 시간이 얼마나 되는지 구해봐라- 뭐 이런 문제였다.

 

핵심은

1. 입력되는 값이 제멋대로이므로, 일단 입력 받은 후에 배열을 오름차순으로 싹 정렬해준다. 왜냐?

2. 인출하는 데 걸리는 시간이 가장 적은 사람을 가장 많이 포함하고, 인출하는 데 가장 오래 걸리는 사람의 시간을 가장 적게 포함할 때 그 값이 최소일 것이므로. (계산하기 쉽게 소요시간이 가장 적은 것부터 순서대로 정렬한다고 생각하면 쉽다.)

 

민지's 풀이

즉, 이 문제의 예시에서는 입력이 [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이라는 결과값에 누적해서 더해주면 된다는 것!! 마 그리디 별 거 없네~😆라고 허세를 떨어보며,,, - 끝 -

 

이번 문제는 한 번에 깔-끔하게 클리어!

반응형

댓글