백준 19637 IF문 좀 대신 써줘
문제
https://www.acmicpc.net/problem/19637
접근방법
이분 탐색
풀이코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Title> tList;
private static class Title {
String name;
int score;
public Title(String name, int score) {
super();
this.name = name;
this.score = score;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
// 1. 입력 및 초기화
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
int N = Integer.parseInt(st.nextToken()); // 칭호 개수
int M = Integer.parseInt(st.nextToken()); // 캐릭터 개수
tList = new ArrayList<Title>();
int tmax = 0;
for(int i=0; i<N; i++) {
st = new StringTokenizer(in.readLine(), " ");
String name = st.nextToken();
int score = Integer.parseInt(st.nextToken());
// 칭호는 전투력 상한값의 비내림차순으로 주어진다.
if(tList.size() == 0 || tmax != score) {
tList.add(new Title(name, score)); // 같은 전투력 배제
}
tmax = score; // 상한값 저장
}
// 2. 이분 탐색
int size = tList.size();
StringBuilder sb = new StringBuilder();
for(int i=0; i<M; i++) {
int num = Integer.parseInt(in.readLine());
int res = binarySearch(0, size-1, num);
sb.append(tList.get(res).name).append('\n');
}
// 3. 정답 출력
System.out.println(sb.toString().trim());
}
public static int binarySearch(int start, int end, int num) {
int mid = 0;
while(start <= end) {
mid = (start+end) / 2;
if(num > tList.get(mid).score) start = mid+1;
else end = mid-1;
}
return end+1;
}
}