https://www.acmicpc.net/problem/31997
풀이
N명의 사람들이 회의에 입장하고 퇴장하는 시간이 주어진다.
M개의 서로 친한 사람들의 쌍이 주어진다.
먼저 각 사람별로 회의에 입장하고 퇴장하는 시간의 정보를 저장한다.
`T + 1` 길이의 배열을 만들어 서로 친한 사람들의 쌍을 입력받으면서 해당 배열에 값을 저장한다.
예를 들어 c와 d가 친하다면 c와 d의 회의 입장/퇴장 정보를 확인하여,
두 사람이 회의에 함께 있는 시간(start)은 `두 사람이 입장하는 시간을 비교하여 큰 값`,
두 사람이 회의에 함께 있다가 함께 하지 않는 시간(end)은 `두 사람이 퇴장하는 시간을 비교하여 작은 값`이 된다.
다만, start가 end보다 같거나 크다면 두 사람은 서로 함께 있지 않는다.
start가 end보다 작은 경우에만 배열에 start에는 +1, end에는 -1을 더해준다.
다 입력한 후, 누적합하여 각 시간에 서로 친한 쌍이 몇 쌍 있는지 출력하면 끝.
근데 회의..즐겁니?
메모리: 108544KB
시간: 576ms
언어: Java 11
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 m = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
int[][] schedule = new int[n + 1][2];
for (int i = 1; i < n + 1; i++) {
st = new StringTokenizer(br.readLine());
schedule[i][0] = Integer.parseInt(st.nextToken());
schedule[i][1] = Integer.parseInt(st.nextToken());
}
int[] timeTable = new int[t + 1];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int c = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int start = Math.max(schedule[c][0], schedule[d][0]);
int end = Math.min(schedule[c][1], schedule[d][1]);
if (start < end) {
timeTable[start]++;
timeTable[end]--;
}
}
for (int i = 1; i < t; i++) {
timeTable[i] += timeTable[i - 1];
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < t; i++) {
sb.append(timeTable[i]).append("\n");
}
System.out.println(sb);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 12913: 매직 포션 - JAVA (0) | 2024.09.10 |
---|---|
[백준]2262: 토너먼트 만들기 - JAVA (3) | 2024.09.09 |
[백준]3151: 합이 0 - JAVA (0) | 2024.09.03 |
[백준] 22352: 항체 인식 - JAVA (0) | 2024.08.19 |
[백준] 10881: 프로도의 선물 포장 - JAVA (0) | 2024.08.13 |
[백준] 15671: 오델로 - JAVA (0) | 2024.08.13 |