Algorithm/Baekjoon Online Judge
[Java] BOJ14890_경사로
'지훈'
2021. 4. 19. 23:45
행과 열을 구분하여 경사로를 놓아 지나갈 수 있는 길의 수를 셌다.
반복문을 진행하면서 평평한 부분의 길이를 세어주고 높이가 1 차이나는 오르막이 나올 경우 평평했던 부분이 놓을 수 있는 경사로보다 길다면 지나갈 수 있다고 판단해준다.
높이가 1 차이나는 내리막이 나올 경우 내리막이 나온 지점부터 평평한 부분의 길이를 세어주어 경사로를 놓을 수 있는지 판단한다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int N,X,map[][];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
X = Integer.parseInt(st.nextToken());
map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(process());
}
private static int process() {
int count = 0;
for (int i = 0; i < N; i++) {
if(makeRoadByRow(i)) count++;
if(makeRoadByCol(i)) count++;
}
return count;
}
private static boolean makeRoadByRow(int i) {
int beforeHeight = map[i][0], size= 0;
int j = 0;
while(j < N) {
if(beforeHeight==map[i][j]) {
++size;
++j;
} else if(beforeHeight+1 == map[i][j]) { //오르막
if(size < X) return false;
beforeHeight++;
size = 1;
++j;
} else if(beforeHeight-1 == map[i][j]) { //내리막
int count = 0;
for (int k = j; k < N; k++) {
if(map[i][k] != beforeHeight-1) break;
if(++count==X) break;
}
if(count < X) return false;
beforeHeight--;
size = 0;
j += X;
} else {
return false;
}
}
return true;
}
private static boolean makeRoadByCol(int i) {
int beforeHeight = map[0][i], size= 0;
int j = 0;
while(j < N) {
if(beforeHeight==map[j][i]) {
++size;
++j;
} else if(beforeHeight+1 == map[j][i]) { //오르막
if(size < X) return false;
beforeHeight++;
size = 1;
++j;
} else if(beforeHeight-1 == map[j][i]) { //내리막
int count = 0;
for (int k = j; k < N; k++) {
if(map[k][i] != beforeHeight-1) break;
if(++count==X) break;
}
if(count < X) return false;
beforeHeight--;
size = 0;
j += X;
} else {
return false;
}
}
return true;
}
}