알고리즘 문제 풀이

숫자개수 세기

딩신 2018. 10. 4. 12:06

숫자 개수 세기 (count.cpp)

 

문제


n개의 숫자가 주어지고, q개의 질문이 주어진다. 각각의 질문은 n개의 숫자 중에서 특정 숫자가 몇개나 있는지를 묻는다. q개의 질문에 모두 답하는 프로그램을 작성하시오.

 

입력


첫 번째 줄에 숫자의 개수 n, 그리고 질문의 개수 q가 주어진다 ( 1 ≤ n ≤ 100,000, 1 ≤ q ≤ 100,000) 두 번째 줄에 n개의 숫자가 주어진다. 세 번째 줄에 q개의 질문이 주어진다.  

출력


각 질문에 대하여 숫자의 개수를 한 줄에 하나씩 출력한다.  

예제 입력

10 4
1 3 4 3 2 3 1 2 5 10
1 3 9 10

예제 출력

2
3
0
1


코드

///숫자세기

import java.util.*;

public class Main {

public static ArrayList<Integer> box = new ArrayList<>();
public static long result;

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int b;
long c[];
int d[];
int count = 0;
long max = Integer.MIN_VALUE;
a = sc.nextInt();
b = sc.nextInt();
c = new long[a];

for (int i = 0; i < a; i++) {
c[i] = sc.nextLong();
if (c[i] > max) max = c[i];
}

sort(c, 0, a - 1);


for (int i = 0; i < b; i++) {
long find = sc.nextLong();
System.out.println(countN(0, a - 1, c, find));
}


sc.close();

}

public static int countN(int s, int e, long[] c, long b) {
if (s > e) return 0;
else if (s == e) {
if (c[s] == b) return findSame(c, b, s);
else return 0;
} else {
int mid = (s + e) / 2;
Long result = c[mid];

if (result == b) return findSame(c, b, mid);
else if (result > b) return countN(s, mid - 1, c, b);
else return countN(mid + 1, e, c, b);
}

}

public static int findSame(long[] c, long b, int k) {

int left = k - 1;
int right = k;

int count = 0;

while (k < c.length && c[k] == b) {
k++;
count++;
}

while (left >= 0 && c[left] == b) {
left--;
count++;
}

return count;
}


public static void sort(long[] data, int l, int r) {
int left = l;
int right = r;
long pivot = data[(l + r) / 2];

do {
while (data[left] < pivot) left++;
while (data[right] > pivot) right--;
if (left <= right) {
long temp = data[left];
data[left] = data[right];
data[right] = temp;
left++;
right--;
}
} while (left <= right);

if (l < right) sort(data, l, right);
if (r > left) sort(data, left, r);
}


}