<Algorithm> 57. 10815번 숫자카드(BinarySearch)
by BFine반응형
1. 10815번 숫자카드
기본 이진탐색 문제, 이진탐색은 임의의 중간지점을 선택하고 찾고자 하는 값과 대소비교하여 반복적으로 찾는 알고리즘 ( O(log N) )
자바에서는 [Arrays.binarySearch(배열, 찾는 값) return 위치] 함수가 존재한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); int[] have = new int[N]; for(int i = 0; i < N ; i++) { have[i] = Integer.parseInt(st.nextToken()); } int M = Integer.parseInt(br.readLine()); st = new StringTokenizer(br.readLine()); int[] haveYou = new int[M]; for(int i = 0; i < M ; i++) { haveYou[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(have); for(int i = 0; i < M ; i++) binarySearch(haveYou[i], 0, have.length - 1 , 0, have); /*for(int i = 0; i < M; i ++) { int k = Arrays.binarySearch(have, haveYou[i]); if(k >= 0) System.out.print(1+" "); else System.out.print(0+" "); }*/ } public static void binarySearch(int haveUone, int start, int end, int middle, int have[]) { //haveUone = 찾을거, start = 시작지점 , end = 끝지점 , m = 중간지점 if(start > end) { System.out.print(0+" "); return; }// 없는 경우( + 1, - 1을 재귀로 반복해 주기 떄문에 start값이 end 값보다 커지는 경우가 존재한다 ) middle = (start+end)/2; if(have[middle] == haveUone) { System.out.print(1+" "); return; }else if(haveUone > have[middle]) { binarySearch(haveUone, middle + 1, end, middle, have); // 찾는 값이 더 큰 경우, 오른쪽 탐색 }else { binarySearch(haveUone, start, middle - 1, middle, have); // 찾는 값이 더 작은 경우, 왼쪽 탐색 } } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 59. 11004번 K번째 수(Quick & Merge Sort) (0) | 2018.08.19 |
---|---|
<Algorithm> 58. 1074번 Z (0) | 2018.08.19 |
<Algorithm> 56. 2263번 트리의 순회 (0) | 2018.08.17 |
<Algorithm> 55. 1735번 분수 합(유클리드) (0) | 2018.08.16 |
<Algorithm> 54. 2579번 계단 오르기 (0) | 2018.08.15 |
블로그의 정보
57개월 BackEnd
BFine