๋ฌธ์
https://www.acmicpc.net/problem/2492
๋ฌธ์ ์ดํด
- ๊ฐ๋ก N, ์ธ๋ก M์ธ ์ง๋ ์์ ๊ธ๊ฐ์ T๊ฐ์ ์ขํ (A, B)๊ฐ ์ฃผ์ด์ง ๋,
๊ฐ์ฅ ๋ง์ ๊ธ๊ฐ์์ ํฌํจํ๋ ์ ์ฌ๊ฐํ์ ์ขํ์ ํฌํจ ๊ฐ์๋ฅผ ๊ตฌํ๋ค. - ์ ์ฌ๊ฐํ์ ๋ณ์ ๊ธธ์ด๋ K์ด๊ณ , ๊ผญ์ง์ ์ ์ ์ ๊ฒฉ์์ ์ ์์ด์ผ ํ๋ค.
- ์ ์ฌ๊ฐํ ๋ณ ์์ ๊ธ๊ฐ์๋ ํฌํจ๋ ๊ฒ์ผ๋ก ๋ณธ๋ค.
๋ฌธ์ ํ์ด
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ
- ๋ฒ์:
1 ≤ N, M ≤ 1,000,000,1 ≤ T ≤ 100,1 ≤ K ≤ N, M,0 ≤ A ≤ N,0 ≤ B ≤ M N, M์ด ์ต๋ 1e6์ด๋ผint[N+1][M+1]๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด ์์ฑ์ ๋ถ๊ฐ๋ฅํ๋ค. (TB๊ธ ํ์)- ์ผ์ชฝ์๋
(x, y)๋ฅผx=0..N-K,y=0..M-K์ ๋ฒ์๋ก ์ ์ ํ์ํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํ๋ค. (์ต์ 1e12 ํ๋ณด)
๋ณด์์ด ์๋ ๊ณณ ๊ธฐ์ค์ผ๋ก ํ์
๋ชจ๋ ๊ธ๊ฐ์์ ์ ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์ ๋ชจ์๋ฆฌ ํ๋ณด๋ก ์ก๊ณ , ํด๋น ์ ์ฌ๊ฐํ์ ํฌํจ๋๋ ๊ธ๊ฐ์ ์๋ฅผ ์ผ๋ค.
rightX = gems[i].x,rightY = gems[j].y์กฐํฉ์ ๋ชจ๋ ์๋- ์ ์ฌ๊ฐํ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ(
rightX - K < 0๋๋rightY - K < 0)์๋ ์ ์ฌ๊ฐํ์ (0,0)์ผ๋ก ๋ถ์ธ๋ค - ๊ฒ์ฌ ๋ฒ์:
[rightX - K .. rightX] × [rightY - K .. rightY] - ์ด๋ ๊ฒ ํ๋ฉด ์ ์ ํ์ ์์ด ํ๋ณด ์๋ฅผ
O(T^2)๋ก ์ค์ด๊ณ ,
๊ฐ ํ๋ณด์์ ๊ธ๊ฐ์T๊ฐ๋ง ์ธ๋ฉด ๋๋ฏ๋ก ์ ์ฒด ์๊ฐ๋ณต์ก๋๋O(T^3)(์ต๋100^3 = 1e6)์ด๋ค. - ๋ฉ๋ชจ๋ฆฌ๋ ๊ธ๊ฐ์ ์ขํ
T๊ฐ๋ง ๋ณด๊ดํ๋ฏ๋กO(T)์ด๋ค.
๋ฐ๋ก
์ ์ฌ๊ฐํ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค.
2 2 1 2
2 1
0 2
1
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
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 t = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
Point[] gems = new Point[t];
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
gems[i] = new Point(x, y);
}
int maxCount = 0;
Point ans = null;
// ๋ชจ๋ ๊ธ๊ฐ์์ ์ ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์ ๋ชจ์๋ฆฌ๋ก ์ ํด์, ํด๋น ์ ์ฌ๊ฐํ์์ ํฌํจ๋๋ ๊ฐ์ ์ธ๊ธฐ
for (int i = 0; i < t; i++) {
for (int j = 0; j < t; j++) {
int rightX = gems[i].x;
int rightY = gems[j].y;
// ์ด ์ ์ฌ๊ฐํ ์์์ ๊ธ๊ฐ์ ๊ฐ์ ๊ตฌํ๊ธฐ
int cnt = 0;
for (int l = 0; l < t; l++) {
int x = gems[l].x;
int y = gems[l].y;
if (rightX - k < 0) {
rightX = k;
}
if (rightY - k < 0) {
rightY = k;
}
if (rightX - k <= x && x <= rightX && rightY - k <= y && y <= rightY) {
cnt++;
}
}
if (cnt >= maxCount) {
maxCount = cnt;
ans = new Point(rightX - k, rightY); // ์ผ์ชฝ ์ ์ขํ ์ ์ฅ
}
}
}
System.out.println(ans.x + " " + ans.y);
System.out.println(maxCount);
}
}'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 14503. ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2025.09.03 |
|---|---|
| [SWEA][Java] 3421. ์์ ๋ฒ๊ฑฐ ์ฅ์ธ (4) | 2025.08.29 |
| [BOJ][Java] 1946. ์ ์ ์ฌ์ (1) | 2025.08.26 |
| [BOJ][Java] 16926. ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 1 (4) | 2025.08.07 |
| [SWEA][Java] 5215. ํ๋ฒ๊ฑฐ ๋ค์ด์ดํธ (4) | 2025.07.18 |