알고리즘 풀이(JAVA) - [이분 탐색] 백준 알고리즘(숫자 카드2)
By on October 6, 2019
문제
문제 링크 : 이분탐색-숫자 카드2 https://www.acmicpc.net/problem/10816
풀이
- 첫번째. 입력 데이터를 배열 처리
- 두번째. 이분 탐색을 위해 카드뭉치 정렬(Arrays.sort(cards))
- 세번째. 정렬된 카드 뭉치(cards) 에서 찾고자 하는 숫자(num)가 시작 되는 배열의 index를 찾는다(findLeft())
- 네번째. 정렬된 카드 뭉치(cards) 에서 찾고자 하는 숫자(num) 보다 처음 큰수가 나오는 index를 찾는다(findRight())
- 다섯째. findRight - findLeft 해서 카운팅을 출력한다.
소스
- 숫자 카드2
package algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Backjoon_10816 {
private static int[] cards;
private static int[] numbers;
public static void main(String[] args) throws NumberFormatException, IOException {
//입력 처리
bufferedRead();
//카드 목록 정렬
Arrays.sort(cards);
//탐색
StringBuilder sb = new StringBuilder();
for (int num : numbers) {
sb.append(find(num)).append(" ");
}
System.out.println(sb.toString());
}
private static int find(int num) {
int left = findLeft(cards, 0, cards.length, num);
int right = findRight(cards, 0, cards.length, num);
return right - left;
}
//찾고자 하는 숫자의 왼쪽 시작 포인트 검색
private static int findLeft(int[] arr, int left, int right, int num) {
int index = (left + right) / 2;
if(left >= right) {
return index;
}
if( arr[index] >= num ) {
return findLeft(arr, left, index, num);
}else {
return findLeft(arr, index + 1, right, num);
}
}
//찾고자 하는 숫자의 오른쪽 종료 포인트 검색
private static int findRight(int[] arr, int left, int right, int num) {
int index = (left + right) / 2;
if(left >= right) {
return index;
}
if( arr[index] <= num ) {
return findRight(arr, index + 1, right, num);
}else {
return findRight(arr, left, index, num);
}
}
private static void bufferedRead() throws NumberFormatException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//숫자 카드의 개수
int n = Integer.parseInt(reader.readLine());
//숫자 카드
String[] inputCards = reader.readLine().split(" ");
//정수의 개수
int m = Integer.parseInt(reader.readLine());
//정수
String[] inputNums = reader.readLine().split(" ");
cards = new int[n];
numbers = new int[m];
for (int i = 0; i < inputCards.length; i++) {
cards[i] = Integer.parseInt(inputCards[i]);
}
for (int i = 0; i < inputNums.length; i++) {
numbers[i] = Integer.parseInt(inputNums[i]);
}
}
}