자바/코드트리
[코드트리] 개발자들의 거리두기 - 자바(Java)
Jakorithm
2024. 6. 6. 01:20
728x90
문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
N명의 개발자들은 일직선상에 서있습니다. 그들 중 일부는 전염병에 감염되었고, 감염된 개발자는 양수 거리 R 이내에 있는 개발자들을 곧바로 감염시킵니다. 거리 R은 알 수 없는 상황에서, 처음에 감염된 개발자 수의 최솟값을 구하는 프로그램을 작성해 보세요.
입력 예시
6
7 1
1 1
15 1
3 1
10 0
6 1
출력 예시
3
코드
첫 번째 줄에는 정수 N이 주어집니다.
두 번째 줄부터는 N개의 줄에 걸쳐 한 줄에 하나씩 각 개발자의 위치와 감염 여부가 주어집니다.
감염 여부는 1 또는 0으로 표현되며, 1이 감염되었음을 뜻합니다. 모든 개발자의 위치는 다름을 가정해도 좋습니다.
- 1 ≤ N ≤ 1,000
- 0 ≤ 위치 ≤ 1,000,000
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][] matrix = new int[n][2];
StringTokenizer st;
// 거리와 감염 여부를 담은 2차원 배열 초기화
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
matrix[i][0] = Integer.parseInt(st.nextToken());
matrix[i][1] = Integer.parseInt(st.nextToken());
}
br.close();
// 거리를 기준으로 오름차순 정렬
Arrays.sort(matrix, Comparator.comparingInt(arr -> arr[0]));
// 최소 감염 거리 R 구하기
int r = Integer.MAX_VALUE;
for (int i = 1; i < n - 1; i++) {
// 현재 감염여부가 0이고 직전 감염여부가 1인 경우
if (matrix[i][1] == 0 && matrix[i + 1][1] == 1) {
r = Math.min(r, matrix[i + 1][0] - matrix[i][0]);
}
// 현재 감염여부가 0이고 다음 감염여부가 1인 경우
if (matrix[i][1] == 0 && matrix[i - 1][1] == 1) {
r = Math.min(r, matrix[i][0] - matrix[i - 1][0]);
}
}
// 첫 감염자 위치와 인덱스 찾기
int idx = 0;
int beforeLocation = 0;
for (int i = 0; i < n; i++) {
if (matrix[i][1] == 1) {
idx = i;
beforeLocation = matrix[i][0];
break;
}
}
int count = 1;
// 첫 감염자 다음 인덱스부터 순회
for (int i = idx + 1; i < n; i++) {
// 현재 사람이 감염자인 경우
if (matrix[i][1] == 1) {
// 직전 감염자와의 거리가 r보다 작은 경우 위치만 갱신
if (matrix[i][0] - beforeLocation < r) {
beforeLocation = matrix[i][0];
} else { // r보다 크거나 같은 경우 count 증가 및 위치 갱신
count++;
beforeLocation = matrix[i][0];
}
}
}
bw.write(String.valueOf(count));
bw.flush();
bw.close();
}
}
728x90