https://www.acmicpc.net/problem/20551
같은 값 중에서 낮은 값을 찾아야 한다.
원래는 만들어진 Arrays.binarySearch()
사용했는데, 답이 나오긴 함, 근데 최적화가 안돼서 그런지 lowerBound문제라 시간이 너무 많이 걸려서 그냥 구현했다.
if (arr[midIdx] == target) {
// 타겟을 찾았으므로, 더 낮은 인덱스가 있는지 왼쪽을 계속 탐색합니다.
int idx = binarySearch(low, midIdx - 1, target);
if (idx != -1) {
return idx;
} else {
return midIdx;
}
}
기존의 값을 찾았을 때도, 멈추지 않고, high
를 midIdx - 1
로 변경해서 계속 진행한다.
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
// input
private static BufferedReader br;
// variables
private static int N, M;
private static int[] arr;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
bw.write(solve());
bw.close();
} // End of main()
private static String solve() throws IOException {
StringBuilder sb = new StringBuilder();
Arrays.sort(arr);
for (int i = 0; i < M; i++) {
int num = Integer.parseInt(br.readLine());
int ret = binarySearch(0, N - 1, num);
sb.append(ret).append('\n');
}
return sb.toString();
} // End of solve()
private static int binarySearch(int low, int high, int target) {
if (low > high) return -1;
int midIdx = (low + high) / 2;
if (arr[midIdx] == target) {
// 타겟을 찾았으므로, 더 낮은 인덱스가 있는지 왼쪽을 계속 탐색합니다.
int idx = binarySearch(low, midIdx - 1, target);
if (idx != -1) {
return idx;
} else {
return midIdx;
}
} else if (arr[midIdx] < target) {
return binarySearch(midIdx + 1, high, target);
} else {
return binarySearch(low, midIdx - 1, target);
}
} // End of binarySearch()
private static void input() throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
} // End of input()
} // End of Main class
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
// input
private static BufferedReader br;
// variables
private static int N, M;
private static int[] arr;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
bw.write(solve());
bw.close();
} // End of main()
private static String solve() throws IOException {
StringBuilder sb = new StringBuilder();
Arrays.sort(arr);
for (int i = 0; i < M; i++) {
int num = Integer.parseInt(br.readLine());
int ret = binarySearch(0, N - 1, num);
sb.append(ret).append('\n');
}
return sb.toString();
} // End of solve()
private static int binarySearch(int low, int high, int target) {
int ret = -1;
while (low <= high) {
int midIdx = (low + high) / 2;
if (arr[midIdx] == target) {
ret = midIdx; // 잠정적인 답으로 저장
high = midIdx - 1; // 왼쪽 절반을 계속 탐색
} else if (arr[midIdx] < target) {
low = midIdx + 1;
} else {
high = midIdx - 1;
}
}
return ret;
} // End of binarySearch()
private static void input() throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
} // End of input()
} // End of Main class