코딩 테스트 스터디/백준

[실버 III] 11399번. ATM

남쪽마을밤송이 2022. 5. 28. 21:44

 문제 

https://www.acmicpc.net/problem/11399

 

11399번: ATM

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

www.acmicpc.net

 사용 언어 

Python3

 풀이 과정 

실버 III이고 문제 설명이 좀 길어서 그래도 좀 난이도가 있겠거니 생각했는데 생각만 하면 코드는 정말 간단한 문제였다!

 

각자가 돈을 인출하는 데 걸리는 시간이 다르기 때문에 사람들이 줄을 서는 순서에 따라서, 기다리는 시간이 차이가 나게 되는데 각자가 기다린 시간을 합쳤을 때의 시간이 최소가 되게 하는 문제였다.

 

따라서 간단하게 돈을 인출하는 데 오래걸리는 사람이 앞에 있으면 모두가 뒤에서 기다려야 하므로,

걸리는 시간을 오름차순 정렬하고 앞에서부터 더해주면 그게 답이 되는 것이다.

 

그렇게 풀고 한 번에 맞았습니다!!

 제출 답안 

from sys import stdin
input = stdin.readline

people = int(input())
time = list(map(int, input().split()))
minTime = 0
time.sort()

for i in range(people):
    for j in range(i+1):
        minTime += time[j]

print(minTime)

 다른 사람 코드 

나는 이중 for문을 사용하고 range를 이용해 인덱스를 돌았는데, 사실 원소값에 직접 접근하는게 가장 빠르다는 것을 공부했었다!! 그리고 그걸 잘 쓰신 아래 코드...

a = int(input())
l = []
total = 0
cur = 0
l = list(map(int, input().split()))

l.sort()
for x in l:
    cur += x
    total += cur
print(total)

➡ 2년 전임을 감안해도 내 코드와 차이가 꽤 난다. 원소에 직접 접근해서 cur에 걸리는 시간을 더하고 total에 또 더하는 방식을 생각한 게 포인트인데 나도 이런 코드가 먼저 생각나도록 연습해야겠다.