아이디어
- target이 들어갈 수 있는 제일 오른쪽 index와 왼쪽 index의 차이를 구한다.
- target 값이 없으면 동일한 index를 반환하므로 0(갯수)이 출력된다.
어려운점 & 실수
정답
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.Arrays;
importjava.util.StringTokenizer;
publicclassN10816 {
publicstaticvoidmain(String[] args) throwsIOException {
BufferedReaderbr = newBufferedReader(newInputStreamReader(System.in));
intN = Integer.parseInt(br.readLine());
int[] arr = newint[N];
StringTokenizerstringTokenizer = newStringTokenizer(br.readLine().trim(), " ");
for (inti = 0; i < N; i++) {
arr[i] = Integer.parseInt(stringTokenizer.nextToken());
}
// 정렬 필요Arrays.sort(arr);
intM = Integer.parseInt(br.readLine());
int[] targets = newint[M];
stringTokenizer = newStringTokenizer(br.readLine().trim(), " ");
for (inti = 0; i < M; i++) {
targets[i] = Integer.parseInt(stringTokenizer.nextToken());
}
StringBuildersb = newStringBuilder();
for (inti = 0; i < M; i++) {
// 왼쪽 인덱스 구하기intlower = lower_index(arr, targets[i]);
// 오른쪽 인덱스 구하기intupper = upper_index(arr, targets[i]);
sb.append(upper - lower).append(' ');
}
System.out.println(sb.toString());
}
privatestaticintlower_index(int[] arr, inttarget) {
intst = 0;
inten = arr.length; // arr.length -1 이 아님을 주의while (st < en) {
intmid = (st + en)/2;
if (arr[mid] < target) {
st = mid + 1;
} elseif (arr[mid] >= target) { //arr[mid] = target인 경우 en을 옮겨준다.en = mid;
}
}
// 값을 찾는게 아니라 값이 들어갈 수 있는 제일 왼쪽 index를 구하는 것이므로..returnst; //st = en으로 가능한 후보가 1개로 확정될 경우 while문을 탈출함
}
privatestaticintupper_index(int[] arr, inttarget) {
intst = 0;
inten = arr.length; // arr.length -1 이 아님을 주의while (st < en) {
intmid = (st + en)/2;
if (arr[mid] <= target) { //arr[mid] = target인 경우 st를 옮겨준다.st = mid + 1;
} elseif (arr[mid] > target) {
en = mid;
}
}
// 값을 찾는게 아니라 값이 들어갈 수 있는 제일 왼쪽 index를 구하는 것이므로..returnst; //st = en으로 가능한 후보가 1개로 확정될 경우 while문을 탈출함
}
}
아이디어
어려운점 & 실수
정답