https://www.acmicpc.net/problem/5464
-주차장에 빈공간이 여러개 있으면 주차장 번호가 가장 작은 곳으로 감
-주차장에 비어있는 공간 없으면 빈공간 생길때까지 차량 대기
이 때, 도착한대로 줄 서서 대기(큐)
-주차료(주차한 차량의 무게 * 단위 무게당 요금 의 합)를 구하는 문제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] currentParking = new int[n + 1]; // 몇번 칸에 몇번차가 주차중인지
int[] carWeight = new int[m + 1]; // 차량들의 무게
int[] parkingWeight = new int[n + 1]; // 주차 공간들의 단위 무게당 요금
int sum = 0;
for (int i = 1; i <=n; i++) {
parkingWeight[i] = Integer.parseInt(br.readLine());
}
for (int i = 1; i <=m; i++) {
carWeight[i] = Integer.parseInt(br.readLine());
}
Queue<Integer> queue = new LinkedList<>();
outer: for (int i = 0; i < 2 * m; i++) {
int car = Integer.parseInt(br.readLine());
if (car > 0) { // 들어오는 차라면
for (int j = 1; j < n + 1; j++) { // 번호 순대로
if (currentParking[j] == 0) { // 빈자리가 있으면
currentParking[j] = car; // 차를 주차
continue outer;
}
}
queue.offer(car); //빈자리가 없으면 큐에 넣음
} else { // 나가는 차라면
for (int j = 1; j < n + 1; j++) {
if (currentParking[j] == car * (-1)) {
currentParking[j] = 0; // 해당 자리를 0으로
sum += parkingWeight[j] * carWeight[car * (-1)];
if (!queue.isEmpty()) currentParking[j] = queue.poll();
// 큐가 비어있지 않다면 차가 빠져나간 자리에 맨 앞에 있는 차를 넣음
break;
}
}
}
}
System.out.println(sum);
}
}
들어오는 차일 경우
->for문을 돌며 주차장에 빈 자리가 있으면 주차장 공간의 작은 번호 순대로 차를 넣는다.
주차장에 빈자리가 없으면 큐에 넣어 대기시킨다.
나가는 차일 경우
-> 나가는 차의 자리를 0으로 바꾸고 sum 에 주차료(주차 공간 단위 무게당 요금 * 차 무게)를 누적시킨다.
큐가 비어있지 않아 대기 하고 있는 차량이 있다면 차가 빠져나간 자리에 큐의 맨앞에 있는 차를 넣는다.
'ALGORITHM' 카테고리의 다른 글
[JAVA] 알고리즘 : 정렬- 선택정렬 (0) | 2022.07.25 |
---|---|
[JAVA] 백준 13335번- 트럭 (0) | 2022.07.24 |
[JAVA] 백준 1157번- 단어 공부 (0) | 2022.07.22 |
[JAVA] 백준 17413번- 단어 뒤집기2 (0) | 2022.07.21 |
[JAVA] 백준 2675번- 문자열 반복 (0) | 2022.07.20 |