[BOJ] 14890. 경사로
15 Apr 2026
Reading time ~2 minutes
풀이
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
static int N,X;
static int dy[]= {0,1,-1,0,0};
static int dx[]= {0,0,0,1,-1};
static int map[][];
static int used[][];
public static void print(int arr[][]) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
public static void clear(int arr[][]) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j]=0;
}
}
}
public static boolean check(int x,int y,int dir,int arr[][]) {
int cnt=0;
for (int i = 1; i <= X; i++) {
int cx=x+i*dx[dir];
int cy=y+i*dy[dir];
if(cx<0 || cx>=N || cy<0 || cy>=N) {return false;}
if(used[cx][cy]>=1) return false;
if(arr[cx][cy]==arr[x][y]-1) {
cnt++;
}
}
if(cnt==X) {
for (int i = 1; i <= X; i++) {
int cx=x+i*dx[dir];
int cy=y+i*dy[dir];
used[cx][cy]++;
}
return true;
}
else return false;
}
public static void main(String[] args) {
int ans = 0;
N=sc.nextInt();
X=sc.nextInt();
map=new int[N][N];
used=new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[i][j]=sc.nextInt();
}
}
// print(map);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(j+1<N) {
if(map[i][j]==map[i][j+1]) {
if(j!=N-1) continue;
}
else if(map[i][j]==map[i][j+1]+1) {
if(!check(i,j,1,map)) {
break;
}
}else if(map[i][j]==map[i][j+1]-1) {
if(!check(i,j+1,2,map)) {
break;
}
}else {
break;
}
}
if(j==(N-1)) {
ans++;
}
}
clear(used);
}
// System.out.println(ans);
for (int j = 0; j < N; j++) {
for (int i = 0; i < N; i++) {
if(i+1<N) {
if(map[i][j]==map[i+1][j]) {
if(i!=N-1) continue;
}
if(map[i][j]==map[i+1][j]+1) {
if(!check(i,j,3,map)) {
break;
}
}else if(map[i][j]==map[i+1][j]-1) {
if(!check(i+1,j,4,map)) {
break;
}
}else {
break;
}
}
if(i==(N-1)) {
ans++;
}
}
clear(used);
}
System.out.println(ans);
}
}