백준 [11399] - ATM
문제
아이디어
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 |
댓글