각 위치에 높이가 주어지고 가로 세로로 이동 가능한 경우의 수를 구하는 문제입니다.
높이가 같은 곳끼리 이동할 수 있으며 길이 l의 경사로를 설치할 수 있습니다.
경사로를 쌓기위해서는 높이 차이가 1이 나야하고 경사로를 쌓기 위한 l만큼의 공간이 필요합니다.
경사로를 설치해서 해당 길을 이동할 수 있는지 찾고 가능한경우를 카운팅해서 출력해주었습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int l = Integer.parseInt(st.nextToken());
int[][] map = new int[n][n];
int ans = 0;
boolean down = false;
boolean chk = false;
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());
}
}
for(int i=0; i<n; ++i) {
int cnt = 0;
int compare = map[i][0];
down = false;
chk = false;
for(int j=0; j<n; ++j) {
if(compare == map[i][j]) {
++cnt;
if((cnt >= l-1) && down) {
down = false;
cnt = 0;
}
} else if(compare == map[i][j] + 1) { // down
if(l!=1 && down) {
chk = true;
break;
}
cnt = 0;
compare = map[i][j];
down = true;
} else if(compare == map[i][j] - 1) { // up
if(down) {
chk = true;
break;
}
if(l!=1 && cnt < l) {
chk = true;
break;
}
compare = map[i][j];
cnt = 1;
} else {
chk = true;
break;
}
}
if(!chk && (!down || l == 1)) {
++ans;
}
}
for(int j=0; j<n; ++j) {
int cnt = 0;
int compare = map[0][j];
down = false;
chk = false;
for(int i=0; i<n; ++i) {
if(compare == map[i][j]) {
++cnt;
if((cnt >= l-1) && down) {
down = false;
cnt = 0;
}
} else if(compare == map[i][j] + 1) { // down
if(l!=1 && down) {
chk = true;
break;
}
cnt = 0;
compare = map[i][j];
down = true;
} else if(compare == map[i][j] - 1) { // up
if(down) {
chk = true;
break;
}
if(l!=1 && cnt < l) {
chk = true;
break;
}
compare = map[i][j];
cnt = 1;
} else {
chk = true;
break;
}
}
if(!chk && (!down || l == 1)) {
++ans;
}
}
System.out.println(ans);
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 16236번 아기 상어 (0) | 2023.02.02 |
---|---|
[Java] 백준 14499번 주사위 굴리기 (0) | 2023.02.01 |
[Java] 백준 12100번 2048 (Eazy) (0) | 2023.01.30 |
[Java] 백준 3190번 뱀 (0) | 2023.01.29 |
[Java] 백준 14502번 연구소 (0) | 2023.01.26 |