안녕하세요 박민성입니다.
오늘은 백준 11399번 ATM을 풀어 보겠습니다.

문제를 보면
입력은 1보다 크거나 같고 1,000보다 작거나 같은 사람의 수 N이 주어지고
둘째 줄에는 돈을 인출하는 시간 N과 P가 주어집니다.
출력은 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력합니다.
처음에 문제를 보고 이해를 못 하였는데요 간단하게
사람의 수 N이 4명이 주어지고 P가
[5, 3, 8, 1]
이렇게 사람마다 걸리는 시간이 주어진다고 한다면
첫 번째 사람은 돈을 인출하는 시간 5분
두 번째 사람은 돈을 인출하는 시간은 3분이지만 첫 번째 사람을 기다리느라 5분을 더 있었으니
두 번째 사람은 총 8분이 걸렸습니다.
세 번째 사람은 돈을 인출하는 시간 8분과 앞에 두 사람이 걸린 시간을 더하면
세 번째 사람은 총 16분이 걸렸습니다.
네 번째 사람도 같은 방법으로 하면 총 17분이 걸립니다.
이렇게 사람들이 걸린 총시간을 다 더한다면 5 + 8 + 16 + 17 이렇게 더하면 총 46분입니다.
지금 문제를 보면 최솟값을 찾아야 하는데요. 간단하게 생각해서 앞사람이 오래 걸리면 뒤에 사람들은 그만큼 늦어지기 때문에
최솟값을 구할려면 작은 수를 앞에 배치하면 됩니다. 왜냐하면 앞에 있는 수 일수록 더 많이 + 되니까요.
간단한 규칙을 찾았는데요. 첫 번째 5를 4번 곱하고 3을 3번 8을 2번 1을 1번 이렇게 첫 번째 사람부터
주어진 사람의 수를 점점 1씩 낮춰서 곱해주고 다 더하면 46이 나옵니다. 왜냐하면 첫번째첫 번째 사람이 걸리는 시간은 첫 번째 사람과 두 번째, 세 번째, 네 번째 사람 모두 수를 사용하기 때문입니다. 이걸 이용하여 문제를 풀 것입니다.

사람의 수를 a로 받아주고 사람마다 걸리는 시간을 arr에 받아줍니다.
그리고 필요한 시간 합을 출력하기 위해서 num을 받아줍니다.
index는 arr로 받은 시간을 사용하기 위해서 선언했습니다.
Array.Sort를 사용하여 arr를 정렬 해줍니다. 오름차순으로 정렬이 되니 앞쪽에 작은 수가 옵니다.

for문을 이용하여 i를 사람 수만큼하고 num에다가 arr [index] * i를 곱해줍니다.
이러면 위에서 말한 것처럼
(5를 4번 곱하고 3을 3번 8을 2번 1을 1번) 이렇게 됩니다.
index를 ++해주어서 다음 사람이 걸린 시간을 더해줄 수 잇도록 해주었습니다. index ++을 밑으로 뺄까도 생각해 보고
i를 0부터 시작하여하고 index 말고 사람의 수로 바꿔서 하는 방법도 있지만 귀찮아서 이걸로 했습니다.
마지막으로 출력해 주면 끝입니다.

이것이 전체 코드입니다.
이렇게 백준에 제출하였더니

정답이었습니다.
'알고리즘 C#' 카테고리의 다른 글
| 뒤에서 5등까지 (Programmers) 문제 풀이 🤔 (0) | 2026.07.19 |
|---|---|
| 😊Programmers에서 배운 것들 (0) | 2026.07.17 |
| 백준 1181번 단어 정렬 C#으로 문제 풀어보기 (0) | 2026.01.06 |
| ☆백준 1543번 문서 검색 C#으로 문제 풀어보기☆ (0) | 2025.12.29 |
| 백준 5555번 반지 C#으로 문제 풀어보기 (0) | 2025.11.26 |