문제 내용은 입력으로 첫 줄에 전체 카약 수, 카약 파손된 수, 스페어 카약이 있는 수를 받은 뒤
두 번째 입력으로는 파손된 카약의 번호를 받고 마지막 입력으로는 스페어 카약이 있는 번호를 받게 되는데 스페어 카약은 번호 위치부터 좌우로만 전해줄 수 있고, 본인의 카약도 파손된 경우에는 남에게 줄 수 없다. 이제 최선의 경우를 구해서 손상된 카약이 총 몇개인지 구해줘야 한다.
주의할 점은 스페어를 든 사람의 카약이 파손되는 경우가 있을 수 있기에 이걸 조심해줘야 한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
ArrayList<Integer> miss = Arrays.stream(Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray())
.boxed().collect(Collectors.toCollection(ArrayList::new));
ArrayList<Integer> spare = Arrays.stream(Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray())
.boxed().collect(Collectors.toCollection(ArrayList::new));
int[] entire = new int[Integer.parseInt(split[0])];
Arrays.setAll(entire, i -> i + 1);
int count = 0;
ArrayList<Integer> missRemove = new ArrayList<>();
for(int i : miss) {
if(spare.contains(i)) {
missRemove.add(i);
spare.removeIf(v -> v == i);
count++;
}
}
for(int i : missRemove) {
miss.removeIf(v -> v == i);
}
for(int i = 0; i<entire.length; i++) {
int index = i;
if(miss.contains(entire[i])) {
if(spare.contains(entire[i] - 1)) {
spare.removeIf(val -> val == entire[index] - 1);
count++;
continue;
}
if(spare.contains(entire[i] + 1)) {
spare.removeIf(val -> val == entire[index] + 1);
count++;
}
}
}
System.out.println(Integer.parseInt(split[1]) - count);
}
}
일단 손상된 카약과 스페어 카약을 List에 담아준 후 손상된 카약과 스페어 카약 값이 같은 경우를 모두 제외하고 처음부터 끝까지 돌려 주면서 손상된 카약을 발견하면 왼쪽부터 먼저 건네주는 식으로 진행해준 뒤 전체 손상된 카약 수에서 스페어를 전해준 경우를 빼주면 끝이다.
Leave a Reply