내가 생각했을때 문제에서 원하는부분
첫째 줄에 배열의 크기 N이 주어진다.
N은 50보다 작거나 같은 자연수이다.
둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다.
원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다.
배열에 중복되는 수는 없다.
첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 입력을 받는다.
그리고 첫 번째 줄에서 배열의 크기인 N을 입력받는다.
배열 초기화:
크기 N의 정수 배열 arr을 생성하고, 다음 N개의 줄에 걸쳐 입력받은 숫자를 배열에 저장해준다.
정렬:
입력받은 배열을 오름차순으로 정렬해준다.
오름차순으로 정렬한 이유는 연속된 수를 찾기 위해서이다.
최소 추가 원소 초기화:
minAdditions 변수를 Integer.MAX_VALUE로 초기화하여, 이후 필요한 최소 추가 원소 수를 비교할 준비를 해준다.
이중 반복문:
첫 번째 반복문에서 각 원소를 시작점으로 설정해준다.
needed 변수를 초기화하여 추가해야 할 원소의 수를 카운트할 준비를 한다.
5개의 연속된 수 확인:
내부 반복문에서는 start로부터 0, 1, 2, 3, 4를 더한 값(currentValue)을 계산해준다.
Arrays.binarySearch()를 사용하여 currentValue가 배열에 존재하는지 확인해준다.
그리고 존재하지 않으면 needed를 증가시킨다.
최소 추가 원소 업데이트:
현재 계산된 needed 값과 minAdditions를 비교하여 더 작은 값을 minAdditions에 저장한다.
결과 출력:
그리고 최종적으로 필요한 최소 추가 원소의 개수를 출력해준다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
// 백준 1337번 문제
public class Main873 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// 배열을 정렬합니다.
Arrays.sort(arr);
int minAdditions = Integer.MAX_VALUE;
// 연속된 수를 만들기 위해 필요한 원소 개수를 계산합니다.
for(int i = 0; i < N; i++) {
// 현재 원소를 시작으로 5개의 연속된 수 체크
int needed = 0;
// 연속 수의 시작점
int start = arr[i];
// 5개의 연속된 수를 체크
for(int j = 0; j < 5; j++) {
int currentValue = start + j;
// 현재 수가 배열에 존재하지 않으면 추가해야 할 원소
if(Arrays.binarySearch(arr, currentValue) < 0) {
needed++;
}
}
minAdditions = Math.min(minAdditions, needed);
}
// 추가할 원소의 최소 개수를 출력
System.out.println(minAdditions);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.