문제 : boj12001
일단 B를 기준으로 모두 살펴보게 되면 O(1,000,000^2)이 되므로 시간초과가 나게 된다. N이 100개밖에 안되므로, N을 기준으로 살펴보면 된다. 처음엔 N개를 입력받고 fence가 교차하는 지점을 모든 N개 지점의 (x+1, y+1)에 있다고 보고 그로 인해 나눠지는 4사분면을 카운팅하면 될꺼라고 생각했다.
예를들어 cow가 주황색 지점에 있는 다음과 같은 상태를 생각해보자.
그럼 다음과 같이 모든 지점의 (x+1, y+1) 지점을 기준으로 나눠보면 답을 찾을 수 있을꺼라 생각했다.
하지만 제출해보니 틀렸고, 반례를 찾아보니 다음과 같은 경우 불가하다.
위의 경우 다음과 같이 나누어야 한다.
어찌되었든 기존 아이디어인 각 지점의 (x+1, y+1)은 분명 맞는 아이디어이다. 다만 거기에서 약간 변경해서, (모든 x+1, 모든 y+1)로 하면 된다. 즉 O(N^2)에서 O(N^3)이 되는것이고(교차점 지정 자체는 O(N)->O(N^2)이고 모든 점을 교차점에 대해 몇사분면에 포함되는지 확인하는데 O(N)이 필요함), N이 최대 100밖에 안되므로 모든 경우를 살펴보면 답을 구할 수 있다.
코드 : github
import java.io.DataInputStream;
import java.io.IOException;
public class Main extends FastInput {
private int getM(int n, int[] x, int[] y, int tx, int ty) {
int[] cnt = new int[4];
for (int i = 0; i < n; i++) {
int curX = x[i];
int curY = y[i];
if (curX > tx && curY > ty) cnt[0]++;
else if (curX > tx && curY < ty) cnt[1]++;
else if (curX < tx && curY > ty) cnt[2]++;
else cnt[3]++;
}
int max = 0;
for (int i = 0; i < 4; i++) {
if (max < cnt[i]) max = cnt[i];
}
return max;
}
private void solution() throws Exception {
int n = nextInt();
nextInt();
int[] x = new int[n];
int[] y = new int[n];
for (int i = 0; i < n; i++) {
x[i] = nextInt();
y[i] = nextInt();
}
int answer = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
answer = Math.min(answer, getM(n, x, y, x[i]+1, y[j]+1));
}
}
System.out.println(answer);
}
public static void main(String[] args) throws Exception {
initFI();
new Main().solution();
}
}
class FastInput {
private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
private static DataInputStream inputStream;
private static byte[] buffer;
private static int curIdx, maxIdx;
protected static void initFI() {
inputStream = new DataInputStream(System.in);
buffer = new byte[DEFAULT_BUFFER_SIZE];
curIdx = maxIdx = 0;
}
protected static int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg) return -ret;
return ret;
}
private static byte read() throws IOException {
if (curIdx == maxIdx) {
maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
if (maxIdx == -1) buffer[0] = -1;
}
return buffer[curIdx++];
}
}
'PS > BOJ' 카테고리의 다른 글
백준 9081 자바 - 단어 맞추기 (BOJ 9081 JAVA) (0) | 2021.12.05 |
---|---|
백준 4882 자바 - 정규형 (BOJ 4882 JAVA) (0) | 2021.12.02 |
백준 1365 자바 - 꼬인 전깃줄 (BOJ 1365 JAVA) (0) | 2021.12.01 |
백준 15970 자바 - 화살표 그리기 (BOJ 15970 JAVA) (0) | 2021.11.30 |
백준 12966 자바 - 턴 게임 2 (BOJ 12966 JAVA) (0) | 2021.11.29 |
댓글