더 많이 실패하기

공부 102일차: 백준 11399번 ATM 자바 java 본문

알고리즘/백준

공부 102일차: 백준 11399번 ATM 자바 java

김발자~ 2022. 11. 9. 22:42
반응형

11399 ATM

https://www.acmicpc.net/problem/11399

 

11399번: ATM

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

www.acmicpc.net

 

 

 


백준 11399번 문제 ATM


문제


 

 

 

 


과정 생각해보기


 

우선 문제를 그림으로 이해해보려 한다

 

그림에 색깔별로 표시한 것처럼, 앞선 사람을 기다린 시간을 모두 더하고 기기 이용을 끝마친 시간까지 더한다

주어진 시간을 중첩하면서 더하는 구조인 것

 

어차피 뒤로 갈수록 각자의 시간을 모두 더한 수이므로, 앞에 있는 숫자가 작을수록 시간은 작아진다

따라서 걸리는 시간에 따라 오름차순으로 돈을 인출하는 것이 가장 짧을 것이다

 

시간을 줄이려면 카운팅정렬이 가장 좋겠지만,

문제에서 요구하는 숫자의 범위가 매우 좁으므로 간단하게 Arrays.sort()를 사용해도 될 듯하다

 

 


정답 인정 코드


 
1)
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
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        Arrays.sort(arr); // 최소 시간을 구하기 위한 오름차순 정렬
 
        int sum = 0;
        int[] tmp = new int[n];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j <= i; j++) {
                tmp[i] += arr[j];    //빈 배열 tmp에 i까지의 합 넣기
            }
        }
        
        for(int i = 0; i < n; i++) {
            sum += tmp[i];
        }
        System.out.println(sum);
    }
 
}
 
cs

 

위에 적은 과정을 매우 친절하게 풀어 쓴 코드

반복문이 상당히 많이 나온다

 

 

2)

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
27
28
29
30
31
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        Arrays.sort(arr); // 최소 시간을 구하기 위한 오름차순 정렬
 
        int sum = 0;
        int totalSum = 0;
        for(int i = 0; i < n; i++) {
            sum += arr[i];
            totalSum += sum;
        }
        System.out.println(totalSum);
    }
 
}
 
cs

 

배열 대신 그냥 정수 변수를 사용하여 작성한 코드

반복문을 매우 많이 줄였다

 

 

 


쉬운 문제들이 연달아 나왔다

반응형
Comments