[백준] 14658: 하늘에서 별똥별이 빗발친다 - JAVA

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

풀이

N, M의 범위가 500000이기 때문에 이것을 기준으로 탐색을하면 시간초과가 난다.

K가 100까지인것을 보고 K를 기준으로 탐색했다.

트램펄린의 어느 모서리에 별이 위치해있어야 많은 별을 담을 수 있다.

별 두개를 선택해 별a의 x좌표와, 별b의 y좌표를 한쪽 꼭지점으로 하는 길이 L의 사각형을 만들어 거기에 별이 얼마나 들어가는지 체크했다.


메모리: 14712KB

시간: 160ms

언어: Java 11

코드

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

public class Main {
    static class Node {
        int x;
        int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static ArrayList<Node> list;

    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());
        int L = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        list = new ArrayList<>();
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            list.add(new Node(x, y));
        }

        int res = 0;
        for (Node a : list) {
            for (Node b : list) {
                res = Math.max(res, inBound(a.x, b.y, L));
            }
        }

        System.out.println(K - res);
    }

    private static int inBound(int i, int j, int l) {
        int cnt = 0;
        for (Node s : list) {
            if (s.x >= i && s.x <= i + l && s.y >= j && s.y <= j + l) {
                cnt++;
            }
        }

        return cnt;
    }

}