이진탐색 정렬된 데이터에서 특정 수의 개수 구하기

jaegeunsong97·2023년 2월 25일
0
post-thumbnail


  • 문제를 보고 생각하다가 어차피 구하는 숫자는 뭉텅이로 위치하기 때문에, 이진탐색을 할 때 왼쪽과 오른쪽 인덱스를 각각 함수를 통해서 구하고 그 사이에 있는 것을 카운팅하면 되지 않을까? 했는데 역시...
import java.util.*;

public class Main {

	public static int lowerBound(int[] arr, int target, int start, int end) {
    	while (start < end) {
        	int mid = (start + end) / 2;
            if (arr[mid] >= target) end = mid;
            else start = mid + 1;
        }
        return end;
    }
    
    public static int upperBound(int[] arr, int target, int start, int end) {
    	while (start < end) {
            int mid = (start + end) / 2;
            if (arr[mid] > target) end = mid;
            else start = mid + 1;
        }
        return end;
    }

	// 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
    public static int countByRange(int[] arr, int leftValue, int rightValue) {
		// 유의 : lowerBound와 upperBound는 end 변수의 값을 배열의 길이로 설정
        int rightIndex = upperBound(arr, rightValue, 0, arr.length);
        int leftIndex = lowerBound(arr, leftValue, 0, arr.length);
        return rightIndex - leftIndex;
    }

	public static void main(String[] args) {
    	 Scanner sc = new Scanner(System.in);
        
        // 데이터의 개수 N, 찾고자 하는 값 x 입력받기
        int n = sc.nextInt();
        int x = sc.nextInt();

        // 전체 데이터 입력받기
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        
        // 값이 [x, x] 범위에 있는 데이터의 개수 계산
        int cnt = countByRange(arr, x, x);
        
        // 값이 x인 원소가 존재하지 않는다면
        if (cnt == 0) System.out.println(-1);
        //  값이 x인 원소가 존재한다면
        else System.out.println(cnt);
    } 
}
import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int N = Integer.parseInt(st.nextToken());
    int X = Integer.parseInt(st.nextToken());

    int[] arr = new int[N];
    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());

    int answer = countByRange(arr, X, X);

    if (answer == 0) System.out.println(-1);
    else System.out.println(answer);
  }


  public static int lowerBound(int[] arr, int target, int start, int end) {
        while (start < end) {
            int mid = (start + end) / 2;
            if (arr[mid] >= target) end = mid;
            else start = mid + 1;
        }
        return end;
    }

    public static int upperBound(int[] arr, int target, int start, int end) {
        while (start < end) {
            int mid = (start + end) / 2;
            if (arr[mid] > target) end = mid;
            else start = mid + 1;
        }
        return end;
    }

    public static int countByRange(int[] arr, int leftValue, int rightValue) {
        int rightIndex = upperBound(arr, rightValue, 0, arr.length);
        int leftIndex = lowerBound(arr, leftValue, 0, arr.length);
        return rightIndex - leftIndex;
    }
}

참조

https://pgmjun.tistory.com/71

profile
현재 블로그 : https://jasonsong97.tistory.com/

0개의 댓글