IT/알고리즘

1일 1코딩

So1_b 2022. 4. 16. 16:59

이진 검색

package chap03;

public class Q4 {
	static String[] sign= {
			"   |", //0
			"---+", //1
			"<- ",  //2
			" + ",  //3
			" ->"   //4
	};
	//자리수 세기
	static int blank(int n) {
		int count=1;
		while(n>9) {
			n/=10;
			count++;
		} return count;
	}
	
	static void BinarySearch(int[] a, int n, int key) {
		int pl=0; int pr=n-1; int pc=(pl+pr)/2;
		int num=n*4;
		int j;
		
		//배열 요소값 저장하기 + 인덱스 출력
		StringBuffer sb=new StringBuffer(a.length);
		System.out.print(sign[0]+"  ");
		
		for(int i=0;i<a.length;i++) {
			j=blank(a[i]);
			sb.append(" ");
			if(j==1) sb.append(" "+a[i]+" ");
			else if(j==2) sb.append(" "+a[i]);
			else if(j==3) sb.append(a[i]);
			System.out.printf("%-4s",i); 
		}
		
		//2행 출력
		System.out.print("\n"+sign[1]); 
		do {
			System.out.print("-");
		}while(num-->0);//먼저실행 1+ 20
		System.out.println();
		
		//
		
		for(int i=0;i<n;i++) { //a.length회 반복한다.
			int idx=0; //<- + -> 가 그려질 인덱스 위치
			System.out.print(sign[0]);
			do {
				System.out.print(" ");
				if(pl==idx) System.out.print(sign[2]); // <-
				else if(pc==idx) System.out.print(sign[3]); // +
				else if(pr==idx) System.out.print(sign[4]+"\n"); // ->
				else System.out.print("   ");
				idx++;
			}while(idx<=pr); //0~n-1회 + 먼저 실행 1 
			
			System.out.print("  "+pc+"|");
			System.out.print(sb+"\n");
			
			
			if(a[pc]==key) {System.out.printf("%d은/는 a[%d]에 있습니다.",key,pc); return;}
			else if(a[pc]>key) {pr=pc-1;}
			else if(a[pc]<key) {pl=pc+1;}
			pc=(pl+pr)/2;
			
			if(pl>pr) return;
			//pl과 pr서로 값이 맞물리면 종료
			
			System.out.println(sign[0]);
		}
	}
	
	public static void main(String[] args) {
		int[] a= {1,2,3,5,6,8,9};
		
		BinarySearch(a,a.length,2);
		//System.out.println("실행이 되나?");
	}
	
}

결과