Hope Everyone Is Happy

[실버4] 11399. ATM (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버4] 11399. ATM (Java)

J 크 2023. 8. 27. 11:40
728x90
반응형

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

 

11399번: ATM

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

www.acmicpc.net

IM, A형 테스트 화이팅입니다~!!


※  문제를 요약하면 아래와 같습니다.

  ATM기 1대 앞에 1번~N번까지 사람이 줄을 서있으며 각자 돈을 인출하는데 걸리는 시간은 P분

앞에 사람이 돈을 뽑는 시간 + 본인 돈을 뽑는 시간 ==  본인이 돈을 뽑을 수 있는 시간

마지막 사람이 돈을 뽑을 때 최소 시간이 될 수 있도록 줄을 세웠을 때, 소요되는 시간 출력

   ex)  Person1 = 3, Person2 = 1, Person3 = 4, Person4 = 3, Person5 = 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분

 Input : 첫줄에 사람의 수, 둘째 줄에 1번 N번까지 돈을 뽑는데 걸리는 시간(분) 입력

 Output : 마지막에 돈을 뽑는 사람의 최소 시간 출력


◈ Input - 1

5
3 1 4 3 2

◈ Output - 1

 

32

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

1번 부터 N번까지의 시간 값을 배열로 저장

배열을 오름차순으로 정렬 (최소 시간 소요)

    ex) 시작이 1분일 경우 2번째 사람 이후 부터는 1분 + 2번째 사람 시간 수 + ... 만 기다리지만,

          시작이 13분일 경우 2번째 사람은 13분 + 2번째 사람 시간 수 + ... 을 확인할 수 있으며

         이로 인해 오래 걸리는 사람을 제일 뒤로 보낼 경우 최소 시간이 소요되는 것을 확인할 수 있다.  

▶ 정렬된 배열을 누적합하여 마지막 누적합 결과 출력


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

		int nPeople = Integer.parseInt(bReader.readLine());

		int[] narrTimes = new int[nPeople];
		StringTokenizer st = new StringTokenizer(bReader.readLine());
		
		for(int i = 0; i < nPeople; i++)
			narrTimes[i] = Integer.parseInt(st.nextToken());
		
		Arrays.sort(narrTimes);
		
		for(int i =0 ; i < nPeople-1; i++) {
			narrTimes[i+1] += narrTimes[i];
		}
		int nSum = 0;
		
		for(int i = 0; i < nPeople;i++)
			nSum += narrTimes[i];
		bWriter.write(String.valueOf(nSum));
		bWriter.flush();

		bWriter.close();
	}
}

읽어주셔서 감사합니다!

Good Luck! (피드백 감사합니다!)