[백준] 19637: IF문 좀 대신 써줘 - JAVA

https://www.acmicpc.net/problem/19637

풀이

N개의 문자열과 숫자가 주어진다.

해당 숫자 이하의 점수라면 해당 문자열이 칭호가 되는 것이다.

문자열과 점수를 배열에 저장해두고 M개의 점수가 나올 때마다

해당 배열을 이용해서 맞는 칭호를 출력해야 한다.

칭호의 개수 최대값이 10의 5제곱이기 때문에 앞에서부터 확인하면 시간초과가 발생한다.

따라서, 이분탐색을 통해 해당 구간에 점수가 포함되는지 확인해주었다.


메모리: 54040KB

시간: 520ms

언어: Java 11

코드

import java.util.*;
import java.io.*;

public class Main {
    static class Node {
        String name;
        int score;

        public Node(String name, int score) {
            this.name = name;
            this.score = score;
        }
    }

    static Node[] arr;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        arr = new Node[n];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i] = new Node(st.nextToken(), Integer.parseInt(st.nextToken()));
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < m; i++) {
            int a = Integer.parseInt(br.readLine());
            sb.append(makeName(a)).append("\n");
        }

        System.out.println(sb);
    }

    private static String makeName(int a) {
        int left = 0;
        int right = arr.length - 1;

        int mid = 0;
        while (left <= right) {
            mid = (left + right) / 2;

            if (arr[mid].score < a) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return arr[left].name;
    }

}