JAVA/JAVA_팀 프로젝트

JAVA_[이진탐색]_ver1

onivv 2023. 11. 26. 17:41

코드 ver0.1

package freefree;

import java.util.Scanner;

public class Task {
	
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //사용자로부터 입력값 받기위해 Scanner클래스 선언
        System.out.println("숫자 범위를 입력하세요.");
        int maxNum = scanner.nextInt();
        // 사용자가 입력한 값 저장하기, maxNum은 30이라 가정
        int[] array = new int[maxNum];
        // 사용자가 입력한 값만큼 배열 저장공간 생성
        for (int i = 0; i < array.length; i++) {	// 배열의 길이만큼 반복
            array[i] = i + 1;	// array 배열 첫번째 저장공간(==array[0])에 1이 저장
        }
        //숫자 범위를 지정해서 array라는 int타입 배열에 담기

        System.out.println("1부터 " + maxNum + "까지의 숫자 중 하나를 생각하세요.");

        int result = -1;	//결과값에 -1(false)담기
        int left = 0;		
        int right = array.length - 1;

        while (left <= right) {
            int mid = (left + right) / 2; //계산한 값은 14.5이지만 int끼리 계산이므로 소수점은 없다. (디버깅표참조)

            System.out.println("현재 추측한 숫자는 " + array[mid] + "입니다."); //array[14] == 15 (디버깅표참조)
            System.out.println("맞으면 0, 작으면 -1, 크면 1을 입력하세요: ");

            int select = scanner.nextInt();

            if (select == 0) {
                // 찾았을 때
                result = array[mid];
                break;
            } else if (select < 0) {
                // 작은 경우
                right = mid - 1;	//범위 좁히기 : 최대값을 현재의 중간값에 -1을 해줌
            } else {
                // 큰 경우
                left = mid + 1;		//범위 좁히기 : 최소값을 현재의 중간값에 +1을 해줌
            }
        }

        if(result != -1){
            System.out.println("찾는 숫자는 " + result + "입니다!^^");
        }
        else{
            System.out.println("숫자를 찾지 못했습니다ㅠㅠ");	//범위 밖의 숫자를 입력했을때
        }
    }
}

 

예시 디버깅표

사용자가 원하는 범위 : 1~30

사용자가 생각하는 숫자 : 20

left <= right left (0) right (29) mid (left+right/2) 변환값
T (0<=29) 0 29 14 ((0+29)/2) left = mid + 1 = 15
T (15<=29) 15 29 22 ((15+29)/2) right = mid - 1 = 21
T (15<=21) 15 21 18 ((15+21)/2) left = mid + 1 = 19
T (19<=21) 19 21 20 ((19+21)/2) right = mid - 1 = 19
T (19<=19) 19 19 19 ((19+19)/2) result = array[19] = 20
break;