728x90
--- 문제 ---
--- 코드 ---
행마다 , 열마다 다음 조건에 맞춰서 검사를 진행해주면 된다.
1. 이전 숫자 - 다음 숫자를 구한다
1-1. 차이가 -1 이면 다음 숫자가 작은 것이므로, 앞으로 이 작은 숫자가 L-1 개가 더 나와야 함 (chekc = L-1) check 가 0이 안되면 못가는 걸로 결론
1-2. 차이가 1 이면 다음 숫자가 큰 것이므로, 지금까지 이전 숫자가 L가 이상 나왔는지 확인 (path>=L) 안나왔으면 길 못가는 걸로 결론
1-3. 차이가 0 이면 이전 숫자의 길이 늘어난 것이므로 길 추가 (++path)
1-4. 차이가 -1 보다 작거나 1보다 큰 경우, 경사로를 못 놓으므로 길 못 가는 걸로 결론 짓기
2. 그 행 혹은 열이 결국 지나가는 게 가능하다고 결론 나면, 가능 경로 추가 (++cnt)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Bj14890 {
public static int N,L,cnt, check, path;
public static int[][] map;
public static boolean possible;
public static int stoi(String s) {
return Integer.parseInt(s);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoi(st.nextToken());
L = stoi(st.nextToken());
map = new int[N][N];
cnt = 0;
for(int i=0; i<N; ++i) {
check = 0;
path = 0;
possible = true;
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; ++j) {
int tmp = stoi(st.nextToken());
map[i][j]= tmp;
// first
if(j==0) {
path=1; continue;
}
int pre = map[i][j-1];
if(possible) {
checkPossible(pre,tmp,j);
}
}
if(possible && check==0) {
++cnt;
}
}
for(int i=0; i<N; ++i) {
check = 0;
path = 0;
possible = true;
for(int j=0; j<N; ++j) {
int tmp = map[j][i];
// first
if(j==0) {
path=1; continue;
}
int pre = map[j-1][i];
if(possible) {
checkPossible(pre,tmp,j);
}
}
if(possible && check==0) {
++cnt;
}
}
System.out.println(cnt);
}
public static void checkPossible ( int pre, int tmp, int j ) {
if(check>0) {
if(pre!=tmp) {
possible = false;
}
else {
--check;
}
}
else {
if(pre==tmp) {
++path;
}
else if(pre-tmp==1) {
check = L - 1;
path = 0;
}
else if(pre-tmp==-1) {
if(path>=L) {
path = 1;
}
else {
possible =false;
}
}
else {
possible = false;
}
}
}
}
--- 출처 ---
반응형