Lumpy Space Princess - Adventure Time
코딩테스트/백준

백준 [11399] - ATM

yaebb_82 2023. 2. 7.

 

 

문제

 

11399번: ATM

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

www.acmicpc.net

 

 

 

아이디어

ex) ATM 기계 앞에 5명이 서있다고 가정했을 때,

  1번 2번 3번 4번 5번
돈 뽑는 시간 (분) 3 1 4 3 2

 

 1번 → 2번 → 3번 → 4번 → 5번 순으로 줄을 서있을 경우  돈 뽑는 데에 필요한 시간의 총 합 : 39분

  1번 2번 3번 4번 5번
돈 뽑는 시간 (분) 3 1 4 3 2
기다리는 시간 (분) 3 4 8 11 13

 

 2번 → 5번 → 1번 → 4번 → 3번 순으로 줄을 서있을 경우  돈 뽑는 데에 필요한 시간의 총 합 : 32분

  2번 5번 1번 4번 3번
돈 뽑는 시간 (분) 1 2 3 3 4
기다리는 시간 (분) 1 3 6 9 13

 

→ 돈 뽑는 데에 필요한 시간의 총 합을 최소로 만들기 위해서는 오름차순 순으로 정렬을 한 뒤에 구해야 최소값이 나오게 된다!

 

 

 

작성한 코드

N = int(input())

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

total = 0
wait_time = list()

for i in people:
    total += i
    wait_time.append(total)

print(sum(wait_time))

 

- 첫째 줄에 사람의 수 N을 입력받는다.

- 둘째 줄에 공백을 기준으로 입력한 값들을 int형으로 형변환하여 people이라는 list에 추가한다.

- people이라는 list를 sort()해서 오름차순으로 정렬시켜준다.

- 리스트에서 앞의 값과 뒤의 값을 더한 걸 변수 total에 저장한다. 그러기 위해서 total을 0으로 초기화시켜준다.

- 돈 뽑는 데에 필요한 시간의 총합을 구하기 위해서 wait_time이라는 리스트를 선언해준다.

- people 리스트를 for문을 돌려서 total을 구한뒤, wait_time 리스트에 total 값을 append()해준다.

- 최종적으로 wait_time의 총합을 sum()을 통해 구한뒤, print()로 출력해준다.

 

 

 

cf.) 더 좋은 코드

N = int(input())

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

total = 0
for i in range(1, N+1):
    total += sum(people[:i])

print(total)

- 내 코드와 for문에서 차이가 있다. (코드가 3줄 정도 줄어드는 것 같음)

- 굳이 리스트를 하나 더 선언할 필요 없이, for문을 돌 때마다 슬라이싱을 한 뒤에 sum()을 통해 총합을 구한 뒤 total에 더해준다.

 

 

 

반응형

'코딩테스트 > 백준' 카테고리의 다른 글

백준 [13305] - 주유소  (0) 2023.02.10
백준 [1541] - 잃어버린 괄호  (0) 2023.02.07
백준 [1931] - 회의실 배정  (0) 2023.02.02
백준 [11047] - 동전 0  (0) 2023.02.02
백준 [2581] - 소수  (0) 2022.08.27

댓글