Jun's Development Journey
[BOJ] 11399 ATM 본문
문제
11399번: ATM
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net
풀이
1) 시간 초과 코드
처음에 브루트 포스 방식으로 시간(ATM 걸리는 시간) 배열의 모든 경우의 수를 이용해 해봤던 코드이지만, 여지없이 시간초과가 떴던 방식이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
//11399 ATM 문제
public class Main {
static boolean[] visited;
static int[] tmp;
static int min = Integer.MAX_VALUE;
public static int get_time(int[] time, int N) {
int sum=0;
int pre_sum=0;
for(int i=0;i<N;i++) {
pre_sum+=time[i];
sum+=pre_sum;
}
return sum;
}
public static void permutation(int[] std, int depth, int N) {
if(depth == N) {
int time = get_time(tmp,N);
min = min > time ? time : min;
return;
}
for(int i=0;i<N;i++) {
if(!visited[i]) {
visited[i] = true;
tmp[depth] = std[i];
permutation(std,depth+1,N);
visited[i] = false;
}
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
//시간 초과 코드
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] P = new int[N];
String ps = br.readLine();
StringTokenizer st = new StringTokenizer(ps," ");
tmp = new int[N];
visited = new boolean[N];
for(int i=0;i<N;i++)
P[i] = Integer.parseInt(st.nextToken());
permutation(P,0,N);
System.out.println(min);
}
}
2) 개선 코드
시간 초과 시행착오 후 그리디 방식을 떠올렸다. 시간 배열을 오름차순으로 정렬하여 시간과 시간간의 차이를 최소로 하는 방식을 택해서 코드를 작성해봤다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
//11399 ATM 문제
public class Main {
public static int get_time(int[] time, int N) {
int sum=0;
int pre_sum=0;
for(int i=0;i<N;i++) {
pre_sum+=time[i];
sum+=pre_sum;
}
return sum;
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] P = new int[N];
String ps = br.readLine();
StringTokenizer st = new StringTokenizer(ps," ");
for(int i=0;i<N;i++)
P[i] = Integer.parseInt(st.nextToken());
Arrays.sort(P);//오름차순
System.out.println(get_time(P,N));
}
}
'BOJ > Greedy' 카테고리의 다른 글
[BOJ] 2965번 캥거루 세마리 (0) | 2021.03.09 |
---|---|
[BOJ] 1434번 책정리 (0) | 2021.03.09 |
[BOJ] 5585번 거스름돈 (0) | 2021.03.09 |
[BOJ] 2720번 세탁소 사장 동혁 (0) | 2021.03.09 |
[BOJ] 1541 잃어버린 괄호 (0) | 2021.02.17 |