package study.exam;
import java.util.*;
public class Ex16 {
int count; // 검색횟수
int inputNum; // 입력된 숫자
int start; // 검색 범위 시작 숫자
int center; // 비교할 검색 범위 중간 숫자
int end; // 검색 범위 끝 숫자
int[] arr; // 100까지 입력할 배열
public static void main(String[] args) {
new Ex16().execute();
}
// 실행
public void execute() {
setArray(); // 배열을 생성하고 100까지 입력한다.
getInputNum(); // 숫자를 입력받는다.
startSearch(); // 검색을 실행하며 과정을 출력한다.
}
// 배열을 생성하고 100까지 입력한다.
public void setArray() {
arr = new int[100]; // 1~100 저장할 배열 생성
for(int i=0; i<arr.length; i++) { // 배열에 100까지 입력
arr[i] = i + 1;
}
}
// 숫자를 입력받는다.
public void getInputNum() {
Scanner scan = new Scanner(System.in);
while(true) {
System.out.print("정수 입력 : ");
try {
inputNum = Integer.parseInt(scan.next());
if(inputNum>100)
throw new Exception();
else
break;
} catch (Exception e) {
System.out.println("100이하의 정수만 입력하시오.");
}
}
}//end getInputNum()
// 검색을 실행한다.
public void startSearch() {
/*
* 범위를 설정한다 (시작 : 1, 끝 : 100)
*
* 1 ~ 100 의 중간값 구한다. -> (1 + 100) / 2 = 50
*
* 입력받은 값 47을 중간값 50 과 비교한다.
*
* 입력받은 값이 중간값 보다 작으면 범위를 재설정한다. (범위끝값에 중간값-1을 대입)
*
* 입력받은 값이 중간값과 같으면 찾는 수이다.
*
* 입력받은 값이 중간값 보다 크면 범위를 재설정한다. (범위시작값에 중간값+1을 대입)
*
*/
start = arr[0];
end = arr[arr.length-1];
String bigSmall = "";
while(inputNum!= center) { // 입력값과 중간값이 같지 않을때 반복
count++;
center = (start + end) / 2;
if(inputNum > center) { // 입력값이 중간값보다 크면
start = center + 1;
bigSmall = "큰";
}else if(inputNum < center) { // 입력값이 중간값보다 작으면
end = center - 1;
bigSmall = "작은";
} else {
break;
}
System.out.printf(
"%d 번째 검색 > %d 은 %d보다 %s %d ~ %d 사이의 수 이다.\n", count,
inputNum, center, bigSmall, start, end);
}//end while
System.out.printf("%d 번째 검색 > %d 은 %d과 같은 수 이다.\n",count,inputNum,center);
System.out.println();
System.out.printf("%d 을 찾는데 총 %d 번 검색하였습니다.\n",inputNum,count);
}
}