Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 웹 호스팅
- 다익스트라
- 호스팅
- 플로이드 와샬
- 삼성 청년 SW 아카데미
- SSAFY
- 동기화
- 최단 경로
- 클라우드 서버
- 프록시
- 프록시서버
- 세마포어란?
- 싸피
- Dijkstra Algorithm
- 세마포어와 뮤텍스의 차이
- 싸피 면접 후기
- 뮤텍스란?
- 호스팅이란?
- Proxy
- 다익스트라 알고리즘
- 플로이드 워셜
- 뮤텍스
- Synchronization
- Proxy Server
- 서버 호스팅
- floyd-warshall
- 세마포어
- 싸피 합격
- 세마포어와 뮤텍스
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
[백준][BOJ-8980][JAVA] 택배 본문
https://www.acmicpc.net/problem/8980
import java.io.*;
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 C = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(br.readLine());
List<Delivery> list = new ArrayList<>();
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int box = Integer.parseInt(st.nextToken());
list.add(new Delivery(a, b, box));
}
Collections.sort(list);
int[] weight = new int[N+1];
Arrays.fill(weight, C);
int result = 0;
for (int i = 0; i < list.size(); i++) {
Delivery d = list.get(i);
int maxBoxNum = Integer.MAX_VALUE;
for (int j = d.start; j < d.end; j++) {
maxBoxNum = Math.min(maxBoxNum, weight[j]);
}
if (maxBoxNum >= d.boxCnt) {
loadBox(weight, d.start, d.end, d.boxCnt);
result += d.boxCnt;
} else {
loadBox(weight, d.start, d.end, maxBoxNum);
result += maxBoxNum;
}
}
System.out.println(result);
}
private static void loadBox(int[] weight, int start, int end, int num) {
for (int j = start; j < end; j++) {
weight[j] -= num;
}
}
}
class Delivery implements Comparable<Delivery>{
int start;
int end;
int boxCnt;
public Delivery(int start, int end, int boxCnt) {
super();
this.start = start;
this.end = end;
this.boxCnt = boxCnt;
}
@Override
public int compareTo(Delivery o) {
if(this.end == o.end) return this.start - o.start;
return this.end - o.end;
}
}
정리
이번 문제의 핵심은 도착 도시에 많은 박스를 내려주는 겁니다. 따라서 도착 도시를 기준으로 오름차순을 정렬하고 도착 도시가 같다면 시작 도시를 기준으로 오름차순을 정렬한 값으로 문제를 풉니다.
- 도착 도시 기준 오름차순 정렬, 같은 경우 시작 시간으로 오름차순 정렬
- 각 마을의 택배 최대 개수로 초기화
- 택배 정보를 반복문 돌린다.
- 택배의 정보 중 보내는 마을과 받는 마을을 보고, 각 마을 당 실을 수 있는 최대한도를 구한다.
- 최대한도와 택배의 정보 중에 택배의 개수를 비교한다.
- 최대한도가 택배의 개수보다 크다면 경로에 해당하는 마을의 택배 가능 개수를 빼준다.
- 반대로 작다면 최대한도를 뺀다.
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준][BOJ-2812][JAVA] 크게 만들기 (0) | 2021.06.05 |
---|---|
[백준][BOJ-1238][JAVA] 파티 (0) | 2021.06.04 |
[백준][BOJ-11000][JAVA] 강의실 배정 (0) | 2021.06.02 |
[백준][BOJ-13549][JAVA] 숨바꼭질 3 (0) | 2021.06.01 |
[백준][BOJ-16398][JAVA] 행성 연결 (0) | 2021.05.31 |
Comments