[백준 #11399] ATM

Yujjin·2025년 1월 31일

백준

목록 보기
9/20
post-thumbnail

백준 #11399 ATM

백준 #11399


문제 설명👩‍🏫

총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.

줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.

각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구해라.

입출력 예

입력
5
3 1 4 3 2

출력
32


내 코드💻

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        
        int n = Integer.parseInt(str);
        int[] time = new int[n];
        
        int sum = 0;
        
        str = br.readLine();
        StringTokenizer st = new StringTokenizer(str, " ");
        for(int i=0;i<n;i++){
            time[i] = Integer.parseInt(st.nextToken());
        }
        
        Arrays.sort(time);
        
        for(int i=0;i<n;i++){
            sum += time[i] * (n-i);
        }
        
        System.out.println(sum);
    }
}

설명💡

최소 시간을 구하기 위해서는 중복되서 합쳐지는 수를 작게 만드는 게 좋기 때문에, 각각의 시간을 입력받아 정렬시키고, 각각의 시간이 전체 sum에서 중복되는 횟수만큼 곱해서 sum을 구했다.


느낀 점 및 궁금한 점🍀

이게 그리디 알고리즘을 써서 한건지 그냥 정렬을 한건지,,, 그리디 알고리즘은 어떻게 써야할지 아직 잘 모르겠다. 더 공부해야할 부분이다..😟

0개의 댓글