백준 온라인 저지/Silver

[BOJ] 11399 - ATM

jooona 2021. 2. 23. 23:35
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/11399

 

11399번: ATM

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

www.acmicpc.net

난이도: 실버 3

사용언어: JAVA

 

풀이

필요한 시간의 합을 최소화하기 위해서는 당연히 짧게 걸리는 순서대로 연산을 수행하면 됩니다. 즉 입력을 한 배열에 담고 해당 배열을 오름차순으로 소팅하여 총시간을 계산해주면 됩니다. 

 

예를 들어, 1 2 3 4 ... 순서로 줄을 서 있다면,

 

1이 인출을 하기 위해 기다려야 하는 시간은 1초

2가 인출을 하기 위해 기다려야 하는 시간은 1+2 = 2초

3이 인출을 하기 위해 기다려야 하는 시간은 1+2+3 = 6초

4가 인출을 하기 위해 기다려야 하는 시간은 1+2+3+4 = 10초 ...

이므로 총 기다려야 하는 시간의 합은 (1+(1+2)+(1+2+3)+(1+2+3+4)+...)이 됩니다.

 

즉 앞에 있는 수가 연산에 가장 많이 포함되기 때문에 작은 순서대로 줄을 세워서 인출을 하면 최소 시간을 구할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
 
class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
        int i;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int []arr = new int[N+1]; // 입력 값을 저장할 배열
        int sum = 0;
        for(i=1;i<=N;i++)
            arr[i] = Integer.parseInt(st.nextToken());
       Arrays.sort(arr); // 소팅
        for(i=1;i<=N;i++){ // 가장 작은 수 부터
            arr[i] += arr[i-1]; // 각 사람별로 기다려야 하는 시간을 구하고
            sum+=arr[i]; // 총 합을 구해줌
        }
        bw.write(String.valueOf(sum));
        bw.flush();
    }
}
cs

 

반응형

'백준 온라인 저지 > Silver' 카테고리의 다른 글

[BOJ] 1463 - 1로 만들기  (0) 2021.02.25
[BOJ] 3986 - 좋은 단어  (0) 2021.02.24
[BOJ] 17413 - 단어 뒤집기 2  (0) 2021.02.20
[BOJ] 2491 - 수열  (0) 2021.02.20
[BOJ] 15988 - 1, 2, 3 더하기 3  (0) 2021.02.20