코드
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr;
static int N, L, ans = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
arr = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
checkColumn(i);
checkRow(i);
}
System.out.println(ans);
}
private static void checkRow(int row) {
Queue<Integer> q = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
q.add(arr[row][i]);
}
canGo(q);
}
private static void checkColumn(int column) {
Queue<Integer> q = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
q.add(arr[i][column]);
}
canGo(q);
}
private static void canGo(Queue<Integer> q) {
boolean downSlope = false;
int current;
int count;
while (!q.isEmpty()) {
current = q.poll();
count = pollEqualToCurrent(q, current);
if (downSlope) {
if (count < L) return;
count -= L;
downSlope = false;
}
if (q.isEmpty()) {
ans++;
return;
}
if (Math.abs(q.peek() - current) >= 2) return;
if (current > q.peek()) {
downSlope = true;
continue;
}
if (current < q.peek()) {
if (count < L) return;
}
}
ans++;
}
private static int pollEqualToCurrent(Queue<Integer> q, int current) {
int count = 1;
while (!q.isEmpty() && current == q.peek()) {
q.poll();
count++;
}
return count;
}
}
- 높이가 낮아진 경우에 대해 엣지케이스를 처리하느라 시간이 엄청 들었다.
- 높이가 낮아졌을 때 downSlope boolean값을 true로 만들고, 다시 동일한 높이의 바닥 길이를 재서 L보다 작으면 불가
- L보다 크면 가능한데 여기서 문제가 생겼다.
- 다시 이후에 높이가 높아진 경우를 어떻게 생각해야되지?
- 그냥 이전에 계산했던 count-L을 그대로 활용했다.
- 인덱스 포지션 잡는 시간이 너무 오래걸림.